美文网首页python大法攻略
Scrapy+redis分布式爬虫(五、爬虫与反爬策略)

Scrapy+redis分布式爬虫(五、爬虫与反爬策略)

作者: 眼君 | 来源:发表于2020-09-15 13:48 被阅读0次

常见反爬虫和对应策略

更换user-agent

更换user-agent是一种很常用的爬虫伪装需求,这里我们可以使用middleware进行设置。
先在settings中设置一个downloader_middleware:

......
USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"
DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':2
}
......
    UserAgentMiddleware是scrapy自带的组件,它会在settings中寻找USER_AGENT,并全局修改替换每一个request中的user-agent, 在settings中默认是注释掉的, 取消掉注释便可使用生效。
    此外,我们还可以对这个middleware进行改写,使其实现随机选取user-agent的功能,在这样做之前前,建议先将默认的UserAgent的Middleware置为None:
......

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None
}
user_agent_list = [
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36",
......
]
......
    之后, 我们在middleware这个文件中重写一个middleware, 实现这些功能:
......
class RandomUserAgentMiddlware(object):
    def __int__(self,crawler):
        super(RandomUserAgentMiddleware,self).__int__()
        self.user_agent_list = crawler.settings.get("user-agent-list")

    @classmethod
    def from_crawler(cls,crawler):
        return cls(crawler)  
        
    def process_request(self,request,spider):
        request.headers.setdefault('user-agent',random())
......

关于随机切换, 这里我们也可以考虑使用fake-useragent这个开源的包来实现:

from fake_useragent import UserAgent
......
class RandomUserAgentMiddlware(object):
    def __int__(self,crawler):
        super(RandomUserAgentMiddleware,self).__int__()
        self.ua = UserAgent()

    @classmethod
    def from_crawler(cls,crawler):
        return cls(crawler)
        
    def process_request(self,request,spider):
        request.headers.setdefault('User-Agent',self.ua.random)
        request.meta["proxy"] = "https://:"
......
关于cookie

cookie是一种常用的反爬手段,有的网站会将给用户的访问记录存储到用户的cookie中,等下次该用户访问时,会查验该cookie作为判断其是否为爬虫的依据,对于这种方式,我们可以将爬虫程序禁止存储cookie即可,例如在scrapy中,禁用cookie可以通过在settings.py中进行如下设置:

COOKIES_ENABLED = True
关于IP代理池

首先,在settings中编写代理:

IPPOOL=[
    {"ipaddr":"219.228.126.86:8123"},
    {"ipaddr":"61.152.81.193:9100"},
    {"ipaddr":"218.82.33.225:53853"},
    {"ipaddr":"223.167.190.17:42789"}
]

配置中间件文件:

import random
from scrapy import signals
from myproxies.settings import IPPOOL
class MyproxiesSpiderMiddleware(object):
      def __init__(self,ip=''):
          self.ip=ip       
      def process_request(self, request, spider):
          thisip=random.choice(IPPOOL)
          print("this is ip:"+thisip["ipaddr"])
          request.meta["proxy"]="http://"+thisip["ipaddr"]

在settings中设置downloader_middlewares:

DOWNLOADER_MIDDLEWARES = {
     'myproxies.middlewares.MyproxiesSpiderMiddleware':125
}

四、selenium不加载图片的设置

......
chrome_opt = webdriver.ChromeOptions()
prefs = {"profile.managed_default_content_sttings.images":2}
chrome_opt.add_experimental_option("prefs",prefs)
browser = webdriver.Chrome(executable_path="",chrome_options = chrome_opt)
......

这样对于一些不需要加载图片的任务, 可以减少很多对象的请求, 可以加速页面的加载速度。

五、无界面浏览器phantomjs的使用

对于我们的一些无界面服务器Centos,ubuntu,可以使用phantomjs。在selenium中它的使用和chrome基本相同。

六、将selenium集成到scrapy中

我们可以考虑将selenium集成到scrapy中, 专门用于解决某些动态页面的加载:

#spiders/XXX.py
......
from selenium import webdriver
from scrapy.xlib.pydispatch import dispatcher
from scrapy import signals

class XXXSpider(object):
    def __init__(self):
        self.browser = webdriver,Chrome(executable_path="")
      super(XXXSpider,self).__init__()
      #通过信号量追踪,将信号spider_closed与函数spider_closed进行绑定
      dispatcher.connect(self.spider_closed,signals.spider_closed)
    def spider_closed(self,spider):
        print("spider closed")
        self.browser.quit()
......

#middlewares.py
from scrapy.http import HtmlResponse
......
class JSPageMiddleware(object):
  def process_request(self,request,spider):
    if spider.name == "<爬虫名>":
      spider.browser.get(request.url)
      import time
      time.sleep(3)
    return HtmlResponse(url=spider.browser.current_url,body=spider.browser.page_source,encoding="utf-8",request=request)
......

middlewares处理过的requests接下来都会被发给downloader进行页面下载, 由于我们的selenium已经进行了页面下载,所以不需要再发给downloader了, 我们直接用selenium分析页面的结果用来构建一个response, 返回给spider。

七、无界面运行chrome的方法

首先安装一个包, 当然这个包只能在linux中使用:

pip install pyvirtualdisplay

我们在脚本中添加相关代码:

#middlewares
from pyvirtualdisplay import Display
display = Display(visible=0,size=(800,600))
display.start()

browser = webdriver.Chrome()
......

八、其它方案

splinter、scrapy-splash、selenium-grid

相关文章

  • 反爬虫到底是怎么一回事?

    爬虫与反爬虫永远是相生相克的:当爬虫知道了反爬策略就可以制定反-反爬策略,同样地,网站知道了爬虫的反-反爬策略就可...

  • Scrapy+redis分布式爬虫(五、爬虫与反爬策略)

    常见反爬虫和对应策略 更换user-agent 更换user-agent是一种很常用的爬虫伪装需求,这里我们可以使...

  • redis分布式爬虫初体验

    scrapy+redis实现分布式爬虫 前言介绍 分布式爬虫又可以称为集群爬虫,和单点爬虫不同的是分布式爬虫可以实...

  • 抖音爬虫教程,python爬虫采集反爬策略

    抖音爬虫教程,python爬虫采集反爬策略一、爬虫与反爬简介爬虫就是我们利用某种程序代替人工批量读取、获取网站上的...

  • 反反爬虫之js加密参数获取

    反爬虫与反反爬虫从爬虫诞生开始就已经存在,反爬策略层出不穷,反反爬也都应对有招。 就我目前碰到的反爬,从简单的us...

  • 分布式爬虫scrapy+redis入门

    利用分布式爬虫scrapy+redis爬取伯乐在线网站,网站网址:http://blog.jobbole.com/...

  • 爬虫基础系列urllib——构造请求头(3)

    爬虫与反爬虫 爬虫:自动获取网站数据的程序 反爬虫:使用技术手段防止爬虫程序爬取数据 反扒机制1 判断用户是否是浏...

  • 1-基本概念

    简介 为什么选择Python做爬虫 需要技能 爬虫与反爬虫 网络爬虫类型 通用网络爬虫 聚焦网络爬虫 增量式网络爬...

  • 爬虫、反爬虫与突破反爬虫

    【爬虫】批量获取网站数据 【反爬虫】防止爬虫批量获取网站数据。反爬需要人力和机器成本。反爬可能将普通用户识别为爬虫...

  • 爬虫的几种类型和处理方式

    普通页面 没有页面(网址+请求头) API接口 针对反爬策略 针对效率低下(分布式爬虫) 先列了个大纲,有时间来写

网友评论

    本文标题:Scrapy+redis分布式爬虫(五、爬虫与反爬策略)

    本文链接:https://www.haomeiwen.com/subject/dinzektx.html