当前位置 博文首页 > 文章内容

    Scrapy02

    作者: 栏目:未分类 时间:2020-08-28 17:53:49

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    一 基于Spider父类进行全站数据的爬取

      - 全站数据的爬取:将所有页码对应的数据爬取

      - 利用yield关键字手动请求(get)的发送,并且写在parse函数的里面:callback是调用回调函数进行数据解析

       yield scrapy.Request(url, callback)

      - 对yield的使用总结:

        1 向管道提交item的时候会用到: yield item

        2 手动请求发送:yield scrapy.Request(url, callback)

      - 手动发起post请求:

        yield scrapy.FormRequest(url, formdata, callback): formdata是一个字典,表示的是一个请求参数

    1.1 案例爬取虎牙全站的数据

    import scrapy
    
    from huyaAll.items import HuyaallItem
    class HuyaSpider(scrapy.Spider):
        name = 'huya'
        # allowed_domains = ['www.xxx.com']
        start_urls = ['https://www.huya.com/g/xingxiu']
    
        # 通用的url模板
        url = 'https://www.huya.com/cache.php?m=LiveList&do=getLiveListByPage&gameId=1663&tagAll=0&page=%d'
    
        # 解析start_urls首页的数据
        def parse(self, response):
            li_list = response.xpath('//*[@id="js-live-list"]/li')
            for li in li_list:
                title = li.xpath('./a[2]/text()').extract_first()
                author = li.xpath('./span/span[1]/i/text()').extract_first()
                hot = li.xpath('./span/span[2]/i[2]/text()').extract_first()
    
                # 实例化item对象,将数据进行封装
                item = HuyaallItem()
                item['title'] = title
                item['author'] = author
                item['hot'] = hot
    
                # 使用yield将item对象提交给管道
                yield item
    
            # 使用yield关键字进行手动请求的发送,并且调用回调函数进行其他页码的数据解析
            for page in range(2, 5):
                new_url = format(self.url%page)
    
                # 发起的是get请求, 也可以在callback中递归调用parse函数
                yield scrapy.Request(url=new_url, callback=self.parse_other)
    
        # 所有的解析方法都必须模拟parse定义,需要有和parse相同的参数,可以在里面进行相关的数据解析
        def parse_other(self, response):
            print(response.json())

     

    二 scrapy五大核心组件

      

     

     工作流程:1. Spider对url进行请求对象的封装,并交给引擎

          2. 引擎将请求对象给调度器,调度器对url请求进行过滤并放到队列里面去,再将请求对象返回给引擎

          3. 引擎将url请求对象交给下载器去请求下载,利用Twisted.whl实现的异步效果

          4. 下载器将下载的response交给引擎,引擎将response给spider进行数据解析

          5.spider将解析完成的数据对象交给引擎,引擎再将数据给管道进行持久化存储

    三 scrapy的请求传参

    四 scrapy的中间件