爬虫大框架之 - Scrapy(四)

234 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情

Scrapy四

一,Request

  1. meta传参(实现不同回调方法之间数据的传递)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0pGz4j8M-1592033249221)(assets/.png)]

  2. dont_filter不过滤(实现请求相同url不会被过滤)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LHSseMrt-1592033249223)(assets/.png)]

  3. POST请求(进行模拟登陆)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9KQOUa7f-1592033249226)(assets/.png)]

二,GitHub登录

  1. 抓包 最好是在无痕窗口(没有任何缓存和cookies数据)
  2. 分析登录的请求,哪些参数是固定的,哪些参数是变化的(多抓几次包对比提交的参数)
  3. 获取变化的参数,构造data数据包,用于POST请求提交

三,Response

  1. 源码[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3368ZRwV-1592033249228)(assets/.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bD69etP8-1592033249230)(assets/.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0YGL1wem-1592033249232)(assets/.png)]

四,日志使用

  1. 直接在回调函数里面写[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C9cDxBTY-1592033249236)(assets/.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aftDoJg2-1592033249239)(assets/.png)]

  2. setting.py 里面设置,全部储存在文件里

    LOG_FILE = "log.log"	# 储存的文件
    LOG_LEVEL = 'DEBUG'		# 设置日志的等级(DEBUG文件很多)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I1FP5ZEU-1592033249243)(assets/.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BYcYmGtY-1592033249246)(assets/.png)]

Scrapy五

一,下载中间件

  1. 位于 引擎 和 下载器 之间(作用类似于Fiddler,可以对request和response进行修改)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TSpV29tj-1592033837546)(assets/.png)]

    setting.py 里面激活下载中间件[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WRGbjnj8-1592033837554)(assets/.png)]

  2. process_request里对request进行添加 headers cookies proxy

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2rQJx8UU-1592033837558)(assets/.png)]

    1. 添加headers[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M5WoCjYi-1592033837564)(assets/.png)]

    2. 添加 cookies

      reque.cookie = {}
      
    3. 添加 proxy

      ip = '127.198.25.1'
      port = '888'
      request.proxy = 'http://{}:{}'.format(ip, port)
      
  3. process_response里对response进行操作(假设请求的时候ip被封了,换ip继续加入队列请求)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LhZVINz6-1592033837569)(assets/.png)]

    1. 对请求失败的请求进行操作

      if response.status_code in [403, 404, 500]:
      	# 删除被封的ip
      	return request	# 把这个request重新加入队列,换一个ip继续请求
      
  4. 内置下载中间件

    如果不想向服务端发送cookies数据,把COOKIES_ENAVLED = True,默认为True

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-atAvSwZs-1592033837572)(assets/.png)]

二,自定义User-Agent

  1. setting.py 里面写一个 User-Agent 列表[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NuhRFrUL-1592033837574)(assets/.png)]

  2. 编写中间件[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LBNvqJn8-1592033837577)(assets/.png)]

    代码逻辑:在 setting.py 里面定义好代理池,这个中间键会通过 from_crawler 这个方法读取 setting.py 里面的代理池生成实例以便我们使用

    MY_USER_AGENT = [
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 "
            "(KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
            "Mozilla/5.0 (X11; CrMY_OS i686 2268.111.0) AppleWebKit/536.11 "
            "(KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 "
            "(KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
            "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 "
            "(KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
            "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 "
            "(KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
            "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 "
            "(KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
            "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 "
            "(KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
            "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
            "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 "
            "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 "
            "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
            "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
            "(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
            "(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
            "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
            "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
            "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
            "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 "
            "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
            "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
            "(KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
            "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 "
            "(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
            "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 "
            "(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
    ]
    
    class RandomUserAgentMiddleware(object):
        
        def __init__(self, user_agents):
            self.user_agents = user_agents
    
        @classmethod
        def from_crawler(cls, crawler):
            s = cls(user_agents=crawler.settings.get("MY_USER_AGENT"))
            return s
    
        def process_request(self, request, spider):
            agent = random.choice(self.user_agents)
            request.headers['User-Agent'] = agent
            return None
    
    def open_spider(self, spider):
        print('------------------爬取开始--------------------')
        self.f = open('课程信息.json', 'w', encoding='utf-8')
    
    def close_spider(self, spider):
        print('------------------爬取结束--------------------')
        self.f.close()
    

三,项目常用设置

  1. 设置优先级在这里插入图片描述[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vsBL346Z-1592033837587)(assets/.png)]
  2. setting.py 里面常用的设置在这里插入图片描述[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w1Ag2SAe-1592033837592)(assets/.png)]

四,对接selenium

  1. selenium介绍

    本是用来自动化测试的(若和python.exe同步录下有chromdriver.exe这个软件,则不需要路径)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7grWy1a7-1592033837594)(assets/.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jtW7Z23p-1592033837595)(assets/.png)]

  2. 利用selenium对经过的请求进行自动化解密操作(通过给meta值来判断,请求是否需要)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jCgcrigq-1592033837599)(assets/.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7B1kppk6-1592033837601)(assets/.png)]

  3. 下载中间键的数字(100~900)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qFtga9dh-1592033837604)(assets/.png)]

  4. spider代码[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AG8LJwxW-1592033837607)(assets/.png)]

  5. 下载中间键的数字(100~900)