欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python爬虫之Scrapy框架(CrawSpider)

程序员文章站 2022-05-06 18:50:57
...

需求 想要爬去糗事百科全站的数据

方法:

(1)基于Scrapy框架中的Spider的递归爬去实现

(2) 基于Scrapy框架的CrawlSpider的自动爬取来进行实现

那么CrawlSpider又是什么呢?如何实现它的自动爬取?

CrawlSpider的简介

一 简介

crawlspider是spider的一个子类,除了继承到Spider的功能外,还派生了其自己的更强大的功能和特性。其中最显著的功能就是'”LinkExtractors链接提取器'。Spider是所有怕爬虫类的基类

二 使用

步骤:

(1)创建scrapy工程:scrapy startproject projectName

(2) 创建爬虫文件:scrapy genspider -t crawl spidername www.xxx.com

注意 这里创建爬虫文件时比之前创建的爬虫文件多了-t crawl 表示的时创建的爬虫文件是一个基于CrawlSpider这个类,而不是Spider这个基类了

(3)生成的爬虫文件和之前的spider基类的爬虫文件有所不同

需求 爬取到抽屉网站中分页中的url

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

#爬取抽屉网站的分页的URL
#注意 这里继承的类是CrawlSpider  而不是Spider
class ChoutiSpider(CrawlSpider):
    name = 'chouti'
    # allowed_domains = ['www.xxx.com']
    start_urls = ['https://dig.chouti.com/r/scoff/hot/1']
    #allow表示链接提取器提取链接的规则
    rules = (
        #Rule  规则提取器:将链接提取器提取到的链接所对应的页面进行指定形式的解析
        #follow 让连接提取器继续作用到链接提取器提取到的链接所对应的页面中
        Rule(LinkExtractor(allow=r'/r/scoff/hot/\d+'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        print(response)
        item = {}
        item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
        item['name'] = response.xpath('//div[@id="name"]').get()
        item['description'] = response.xpath('//div[@id="description"]').get()
        return item

需求 爬取糗事百科网站的分页的URL

#爬取糗事百科网站的分页的URL
class ChoutiSpider(CrawlSpider):
    name = 'qiubai'
    # allowed_domains = ['www.xxx.com']
    start_urls = ['https://www.qiushibaike.com/pic/']
    #allow表示链接提取器提取链接的规则
    link = LinkExtractor(allow=r'/pic/page/\d+\?s=\d+')
    link1 = LinkExtractor(allow=r'/pic/$')
    #注意这里可以有多个规则
    rules = (
        #Rule  规则提取器:将链接提取器提取到的链接所对应的页面进行指定形式的解析
        #follow 让连接提取器继续作用到链接提取器提取到的链接所对应的页面中
        Rule(link, callback='parse_item', follow=True),
        Rule(link1,callback='parse_item',follow=True)
    )

    def parse_item(self, response):
        print(response)