使用CrawlSpider爬取全站数据。

CrawpSpider和Spider的区别

CrawlSpider使用基于规则的方式来定义如何跟踪链接和提取数据。它支持定义规则来自动跟踪链接,并可以根据链接的特征来确定如何爬取和提取数据。CrawlSpider可以对多个页面进行同样的操作,所以可以爬取全站的数据。CrawlSpider可以使用LinkExtractor用正则表达式自动提取链接,而不需要手动编写链接提取代码。
Spider和CrawlSpider都是Scrapy的Spider类的子类。
注意:CrawlSpider是不支持请求传参的!(多个parse函数的参数之间的来回传递)

CrawlSpider使用步骤

  1. 创建一个工程 XXXPro scrapy startproject XXXPro
  2. cd XXXPro
  3. 创建爬虫文件(CrawlSpider):scrapy genspider -t crawl xxx www.xxxx.com
    • 链接提取器LinkExtractor:根据指定的规则(allow)(正则表达式)进行指定链接的提取
    • 规则解析器Rule:将链接提取器提取到的链接进行指定规则(callback)的解析

爬取全页的链接

在这里插入图片描述
我们可以根据每页的链接形式,使用正则表达式来进行提取。
通过使用下面的链接提取器,可以得到所有页面的链接,而且虽然提取到的链接是不全的,CrawlSpider还会自动补全。

    link = LinkExtractor(allow=r"/content/node_21745_")    # 这个链接提取器是用于在页面源码中根据制定规则进行正则匹配的

爬取每个新闻详情页的url

    link_detail = LinkExtractor(allow=r"/content/20")

补充规则解析器

    rules = (Rule(link, callback="parse_item", follow=False),   # #follow=True:可以将链接提取器 继续作用到 连接提取器提取到的链接 所对应的页面中
             Rule(link_detail, callback="parse_detail", follow=False))

parse解析函数

# 解析新闻标题
    def parse_item(self, response):
        # 注意:xpath表达式中不可以出现tbody标签
        a_list = response.xpath('/html/body/section[2]/div[3]/div[2]/div[1]/div[4]/ul/a')
       # print(li_list)
        for a in a_list:
            title = a.xpath('./li/p/text()').extract_first()
            item = SunproItem()
            item['title'] = title
           # print(" title:", title)
            yield item
        print(len(a_list))
    # 解析新闻内容
    def parse_detail(self, response):
       # print("parse_detail正在执行")
        content = response.xpath('//*[@id="news_con"]//text()').extract()
        content = ''.join(content)
        item = DetailItem()
        item['content'] = content
       # print("news content:", content)
        yield item

pipelines管道类

class SunproPipeline:
    def process_item(self, item, spider):
        if item.__class__.__name__ == 'SunproItem':
            print(item['title'])
        else:
            print(item['content'])
        return item

注意要在setings.py中开启管道类

你可能感兴趣的:(爬虫学习,python,开发语言)