Python数据爬虫学习笔记(17)Scrapy糗事百科Crawl自动爬虫

一、需求:在糗事百科主页下,无需设置页码,自动爬取所有段子详情页的段子完整内容。

(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快捷键强制停止。

感谢韦玮老师的指导

猜你喜欢

转载自blog.csdn.net/Smart3S/article/details/82939608