• 使用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_")    # 这个链接提取器是用于在页面源码中根据制定规则进行正则匹配的
    
    • 1

    爬取每个新闻详情页的url

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

    补充规则解析器

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

    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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
        # 解析新闻内容
        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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    pipelines管道类

    class SunproPipeline:
        def process_item(self, item, spider):
            if item.__class__.__name__ == 'SunproItem':
                print(item['title'])
            else:
                print(item['content'])
            return item
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

  • 相关阅读:
    Python每日一练(牛客新题库)——第15天:字典、函数练习
    创建一个servlet处理用户登录请求,如果正确将用户名保存在session中,并跳转到主页面。要求,主页面要有登录权限。
    3D建模新手必学:zBrush常用笔刷
    02 记一次 netty 内存泄露
    领英-如何合并或注销重复领英帐号及利用领英高效开发客户技巧
    部署项目半途而废后续
    CSDN的MD编辑器【写作技巧】
    vue移动端H5调起手机发送短信(兼容ios和android)
    专业的期货开户经理让新手如鱼得水
    uni-app设置页面整体背景颜色为渐变色踩坑
  • 原文地址:https://blog.csdn.net/qq_45895217/article/details/133529684