python爬虫--------scrapy学习笔记(二)

CrawlSpider爬虫的讲解+一个CrawlSpider爬虫小案例


1.CrwalSpider的介绍

crawlspider是Spider的派生类(一个子类),Spider类的设计原则是只爬取start_url列表中的网页,而CrawlSpider类定义了一些规则(rule)来提供跟进link的方便的机制,从爬取的网页中获取link并继续爬取的工作更适合。

2.CrwalSpider的创建

创建项目

创建项目和scrapy项目的创建过程一样
scrapy startproject + 项目名称

这里我创建了一个名叫WXapp的项目:
在这里插入图片描述

创建CrawlSpider爬虫

这里和scrapy模块的创建不一样,这里多了‘-t crawl’.
scrapy genspider -t crawl 项目名称 + 域(先进入到项目目录下再创建)

在这里插入图片描述
我们用pycharm打开刚刚创建的爬虫:
这是自动生成的代码,显而易见,这个爬虫继承的类是CrawlSpider,其中的rules属性是这个爬虫的核心。
在这里插入图片描述
下面来介绍一下rules属性:

3.rules属性

  • LinkExtractor(…),用于提取response中的链接
  • callback=‘str’,回调函数,对提取的链接使用,用于提取数据填充item
  • cb_kwargs,传递给回调函数的参数字典
  • follow=True/False,对提取的链接是否需要跟进
  • process_links,一个过滤链接的函数
  • process_request,一个过滤链接Request的函数上面的参数除了LinkExtractor外其它都是可选的,且当callback参数为None时,我们称这个rule为一个‘跳板’,也就是只下载页面,并不进行任何行为,通常作翻页功能

LinkExtractor参数

LinkExtractor有十个参数,分别是

  1. allow=‘re_str’:正则表达式字符串,提取response中符合re表达式的链接。
  2. deny=‘re_str’:排除正则表达式匹配的链接
  3. restrict_xpaths=‘xpath_str’:提取满足xpath表达式的链接
  4. restrict_css=‘css_str’:提取满足css表达式的链接
  5. allow_domains=‘domain_str’:允许的域名
  6. deny_domains=‘domain_str’:排除的域名
  7. tags=‘tag’/[‘tag1’,’tag2’,…]:提取指定标签下的链接,默认会从a和area标签下提取链接
  8. attrs=[‘href’,’src’,…]:提取满足属性的链接
  9. unique=True/False:链接是否去重
    10.process_value:值处理函数,优先级要大于allow
    以上的参数可以一起使用,以提取同时满足条件的链接

follow参数

follow:指定根据该规则从response中提取的链接是否需要跟进。可以是:True或False.

callback 参数

callback:callback为回调函数,用于LinkExtractor参数在response中提取的链接使用

rules是怎么工作的?

rules是这个CrawlSpider的核心,如果在这个rules中写了有callback参数,比如CrawlSpider=‘parse’,那么会对Rule提取的链接会自动调用parse函数,并返回response,如果follow参数为True的话,就会更进,对提取的链接,对提取所满足条件的链接继续执行parse解析,

4.CrawlSpider爬虫案例

这里我们爬取小程序社区
我们获取里面每一篇文章的信息
在这里插入图片描述
代码奉上:(WXapp_spider.py文件)

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy_demo.WXapp.WXapp.items import WxappItem

class WxappSpiderSpider(CrawlSpider):
    name = 'WXapp_spider'
    allowed_domains = ['wxapp-union.com']
    start_urls = ['http://www.wxapp-union.com/portal.php?mod=list&catid=2&page=1']

    rules = (
        Rule(LinkExtractor(allow=r'mod=list&catid=2&page=\d'),follow=True),
        Rule(LinkExtractor(allow=r'article-\d*-\d*.html'),callback='parse_item',follow=True)
    )

    def parse_item(self, 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()
        article_name = response.xpath("//h1[@class='ph']/text()").get()
        author_name = response.xpath('//p[@class="authors"]/a/text()').get()
        article_time = response.xpath('//p[@class="authors"]//span/text()').get()
        introduce = response.xpath('//td[@id="article_content"]//text()').getall()
        article_introduce = "".join(introduce)
        item = WxappItem(article_name=article_name,author_name=author_name,article_time=article_time,article_introduce=article_introduce)
        yield  item

另外,我还修改了这个项目的另外两个文件,
在这里插入图片描述
在这里插入图片描述
修改setting.py文件(让它取消注释,否则item在传数据时,不会保存json)
在这里插入图片描述

6.小结

需要使用LinkExtractorRule,这两个东西决定爬虫的具体走向。
1.allow设置规则的方法:要能够限制在我们想要的ur1上面。不要跟其他的ur1产生相同的正则表达式即可。
2.什么情况下使用follow:如果在爬取页面的时候,需要将满足当前条件的url再进行跟进,那么就设置为True。否则设置为Fasle。
3.什么情况下该指定callback:如果这个url对应的页面,只是为了获取更多的url,并不需要里面的数据,那么可以不指定callback.如果想要获取url对应页面中的数据,那么就需要指定一个callback。


参考:https://blog.csdn.net/killeri/article/details/80255500

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章