爬虫scrapy框架进阶-CrawlSpider, Rule

文章适合于所有的相关人士进行学习
各位看官看完了之后不要立刻转身呀
期待三连关注小小博主加收藏
⚓️小小博主回关快 会给你意想不到的惊喜呀⚓️


文章目录

    • scrapy中加入CrawlSpider
        • ️创建项目
        • ️ 提取器和规则RULE
    • scrapy爬虫实战
        • ️分析网站
        • ️ 代码部分
          • 1.settings部分
          • 2.starts部分
          • 3.items部分
          • 4.重要的lyw_spider部分
          • 5.pipelines部分

scrapy中加入CrawlSpider

如果把scrapy使用requests进行翻页比作是一个人,完成一次爬取请求一次,完成一次请求一次。如图一个一个进行爬取。
爬虫scrapy框架进阶-CrawlSpider, Rule_第1张图片

那么用了CrawlSpider就像是所有的符合这种条件的都给我爬取。如图所有符合秃头小宝贝的都给我爬。
爬虫scrapy框架进阶-CrawlSpider, Rule_第2张图片

之前使用普通的Spider,我们是自己在解析完整个页面后获取下一页的url,然后重新发送一个请求。有时候我们想要这样做,只要满足某个条件的url,都给我进行爬取。那么这时候我们就可以通过CrawlSpider来帮我们完成了。CrawlSpider继承自Spider,只不过是在之前的基础之上增加了新的功能,可以定义爬取的url的规则,以后scrapy碰到满足条件的url都进行爬取,而不用手动的yield Request。

️创建项目

之前创建爬虫的方式是通过scrapy genspider [爬虫名字] [域名]的方式创建的。如果想要创建CrawlSpider爬虫,那么应该通过以下命令创建:

scrapy genspider -t crawl [爬虫名字] [域名]

️ 提取器和规则RULE

使用LinkExtractors可以不用程序员自己提取想要的url,然后发送请求。这些工作都可以交给LinkExtractors,他会在所有爬的页面中找到满足规则的url,实现自动的爬取。以下对LinkExtractors类做一个简单的介绍:
class scrapy.linkextractors.LinkExtractor(allow = (),deny = (),allow_domains = (),deny_domains = (),deny_extensions = None,restrict_xpaths = (),tags = (‘a’,‘area’),attrs = (‘href’),canonicalize = True,unique = True,process_value = None)
主要参数讲解:
allow:允许的url。所有满足这个正则表达式的url都会被提取。
deny:禁止的url。所有满足这个正则表达式的url都不会被提取。
allow_domains:允许的域名。只有在这个里面指定的域名的url才会被提取。
deny_domains:禁止的域名。所有在这个里面指定的域名的url都不会被提取。
restrict_xpaths:严格的xpath。和allow共同过滤链接。

Rule规则类:
定义爬虫的规则类。以下对这个类做一个简单的介绍:
class scrapy.spiders.Rule(link_extractor, callback = None, cb_kwargs = None, follow = None,process_links = None, process_request = None)
主要参数讲解:
link_extractor:一个LinkExtractor对象,用于定义爬取规则。
callback:满足这个规则的url,应该要执行哪个回调函数。因为CrawlSpider使用了parse作为回调函数,因此不要覆盖parse作为回调函数自己的回调函数。
follow:指定根据该规则从response中提取的链接是否需要跟进。
process_links:从link_extractor中获取到链接后会传递给这个函数,用来过滤不需要爬取的链接。

其实总结一下就是我们使用一定的规则来直接判断我们想要什么访问什么样的网址,只要符合这个规则,我们就直接爬取。

scrapy爬虫实战

️分析网站

第一步我们先要找到翻页的rule,看看到底符合什么样的规则。
爬虫scrapy框架进阶-CrawlSpider, Rule_第3张图片

我们发现符合/latest/p\d+.html

不难理解\d+表示一个或多个数字
.表示. \表示转义字符的意思
第二步就是我们要找到需要访问的具体内容的url,同上一个道理。

/archives/\d+
解释也同上所示,其中看过上面rule规则的,我们可以知道rule又follow参数,那么follow参数是干什么的呢?callback参数又是什么呢?
follow:指定根据该规则从response中提取的链接是否需要跟进。
callback:满足这个规则的url,应该要执行哪个回调函数。因为CrawlSpider使用了parse作为回调函数,因此不要覆盖parse作为回调函数自己的回调函数。

那么对于翻页我们肯定是要跟进的,对于详细内容的网址是不用的,但是需要反馈给爬虫。
这些我们分析完成之后呢,就使用xpath或者css或者bs4或者正则表达式来进行爬取了。
那我们就直接开写:
爬虫scrapy框架进阶-CrawlSpider, Rule_第4张图片

️ 代码部分
1.settings部分

把机器人协议关掉。添加headers。然后打开管道。三个操作。

ROBOTSTXT_OBEY = False

DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'en',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36'
}

ITEM_PIPELINES = {
   'lyw.pipelines.LywPipeline': 300,
}
2.starts部分

这里不多说,运行程序的demo。

from scrapy import cmdline
cmdline.execute("scrapy crawl lyw_spider".split(" "))
3.items部分

把我们想要的内容放进来。

class LywItem(scrapy.Item):
    title = scrapy.Field()
    pub_time=scrapy.Field()
    content=scrapy.Field()
    origin=scrapy.Field()
4.重要的lyw_spider部分

主要包括了对细节网站的分析,获取到标题,发布时间,文本,和详情页面的url。

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


class LywSpiderSpider(CrawlSpider):
    name = 'lyw_spider'
    allowed_domains = ['lieyunwang.com']
    start_urls = ['https://www.lieyunwang.com/latest/p1.html']

    rules = (
        Rule(LinkExtractor(allow=r'/latest/p\d+\.html'),follow=True),
        Rule(LinkExtractor(allow=r'/archives/\d+'),callback="parse_detail",follow=False)
    )

    def parse_detail(self, response):
        title_list=response.xpath("//h1[@class='lyw-article-title-inner']/text()").getall()
        title="".join(title_list).strip()
        pub_time=response.xpath("//h1[@class='lyw-article-title-inner']/span/text()").get()
        content=response.xpath("//div[@class='main-text']").get()
        origin=response.url
        item=LywItem(title=title,pub_time=pub_time,content=content,origin=origin)
        yield item
5.pipelines部分
class LywPipeline:
    def process_item(self, item, spider):
        print("*"*30)
        print(item)
        print("*"*30)
        return item

我们在这里直接就在运行端进行输出了,没有保存到文件当中,如果有小伙伴们想要保存的话,可以使用csv进行保存到文件当中。
爬虫scrapy框架进阶-CrawlSpider, Rule_第5张图片

文章适合于所有的相关人士进行学习
各位看官看完了之后不要立刻转身呀
期待三连关注小小博主加收藏
⚓️小小博主回关快 会给你意想不到的惊喜呀⚓️

你可能感兴趣的:(爬虫,python,数据挖掘,scrapy)