一、需求:在糗事百科主页下,无需设置页码,自动爬取所有段子详情页的段子完整内容。
(1)糗事百科主页:
(2)段子详情页:
二、Scrapy实现思路:
在糗事百科主页上自动提取出所有段子的详情链接,在每个段字详情页中爬取段子内容。
三、网页源代码分析:
1、糗事百科段子详情页链接分析:注意到每个段子详情的链接都含有“article”
2、糗事百科段子详情页源码分析,注意到段子内容被class属性为content的div标签所包围,段子链接则存在于rel属性为canonical的link标签的href属性中:
四、创建Scrapy项目:
1、进入CMD,通过命令进入合适的目录,输入:
scrapy startproject qiushibaike
qiushibaike为项目名称。
2、通过CMD命令进入创建的项目,通过命令创建爬虫文件:
scrapy genspider -t crawl autoSpider qiushibaike.com
五、编写代码:
1、items.py:
import scrapy
class QiushibaikeItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
#设置爬取段子内容
content=scrapy.Field()
#设置爬取段子链接
link=scrapy.Field()
2、pipelines.py:
class QiushibaikePipeline(object):
def process_item(self, item, spider):
for i in range(0,len(item["content"])):
print(item["content"][i])
print(item["link"][i])
return item
3、settings.py:
#设置浏览器伪装
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6756.400 QQBrowser/10.3.2415.400'
#设置不遵守robots协议
ROBOTSTXT_OBEY = False
#设置启用pipelines
ITEM_PIPELINES = {
'qiushibaike.pipelines.QiushibaikePipeline': 300,
}
4、autoSpider.py:
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from qiushibaike.items import QiushibaikeItem
#模拟浏览器
from scrapy.http import Request
class AutospiderSpider(CrawlSpider):
name = 'autoSpider'
allowed_domains = ['qiushibaike.com']
#注释掉自带的start_urls,以start_requests函数来代替,目的是为了浏览器伪装
'''
start_urls = ['http://www.qiushibaike.com/']
'''
def start_requests(self):
#模拟浏览器
ua={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6756.400 QQBrowser/10.3.2415.400"}
yield Request('http://www.qiushibaike.com/',headers=ua)
#设置自动爬取链接的规则,allow后是过滤链接的正则表达式,follow则设置链接是否跟进
rules = (
Rule(LinkExtractor(allow=r'article'), callback='parse_item', follow=True),
)
def parse_item(self, response):
#段子内容及链接提取
i = QiushibaikeItem()
i["content"] = response.xpath("//div[@class='content']/text()").extract()
i["link"] = response.xpath("//link[@rel='canonical']/@href").extract()
return i
六、运行结果:
爬虫会持续运行...........可使用Ctrl+C快捷键强制停止。