Scrapy突破反爬虫的限制

随机切换UserAgent

https://github.com/hellysmile/fake-useragent

scrapy使用fake-useragent

在全局配置文件中禁用掉默认的UA,将其设置为None即可

settings.py

DOWNLOADER_MIDDLEWARES = {
    ...
    ‘scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware‘: None,
}

在中间件中编写自己的middleware

middlewares.py

class RandomUserAgentMiddleware(object):
    def __init__(self, crawler):
        super(RandomUserAgentMiddleware, self).__init__()
        self.ua = UserAgent()
        self.ua_type = crawler.settings.get(‘RANDOM_UA_TYPE‘, ‘random‘)

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler)

    def process_request(self, request, spider):
        def get_ua():
            return getattr(self.ua, self.ua_type)

        request.headers.setdefault(‘User-Agent‘, get_ua())

将自己写的middleware配置进settings中

DOWNLOADER_MIDDLEWARES = {
    ‘myproject.middlewares.CustomDownloaderMiddleware‘: 543,
    ‘scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware‘: None,
}

随机切换IP

https://github.com/scrapy-plugins/scrapy-crawlera

爬取西刺IP代理网站获取IP

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from w3lib.html import remove_tags

from ArticleSpider.items import ProxyIpItemLoader, ProxyIpItem

class ProxyIpSpider(CrawlSpider):
    name = ‘proxy‘
    allowed_domains = [‘www.xicidaili.com‘]
    start_urls = [‘http://www.xicidaili.com‘]

    rules = (
        Rule(LinkExtractor(allow=(‘nn/\d*‘)), callback=‘parse_detail‘, follow=True),
    )

    def parse_detail(self, response):
        ip_list = response.css(‘#ip_list tr‘)
        for ipdata in ip_list[1:]:
            item_loader = ProxyIpItemLoader(item=ProxyIpItem(), response=response)
            data = ipdata.css(‘td‘)
            item_loader.add_value(‘ip‘, data[1].css(‘td::text‘).extract_first())
            item_loader.add_value(‘port‘, data[2].css(‘td::text‘).extract_first())
            item_loader.add_value(‘addr‘, self.get_addr(data[3]))
            item_loader.add_value(‘ishidden‘, data[4].css(‘td::text‘).extract_first())
            item_loader.add_value(‘type‘, data[5].css(‘td::text‘).extract_first())
            item_loader.add_value(‘speed‘, data[6].css(‘div::attr(title)‘).extract_first())
            item_loader.add_value(‘conn_time‘, data[7].css(‘div::attr(title)‘).extract_first())
            item_loader.add_value(‘live_time‘, data[8].css(‘td::text‘).extract_first())
            item_loader.add_value(‘check_time‘, data[9].css(‘td::text‘).extract_first())

            proxy_ip_item = item_loader.load_item()

            yield proxy_ip_item

    def get_addr(self, value):
        if value.css(‘a‘):
            return remove_tags(value.extract()).strip()
        else:
            return "未知"

对数据进行简单处理

class ProxyIpItemLoader(ItemLoader):
    default_output_processor = TakeFirst()

def live_time(value):
    ‘‘‘
    分钟, 小时, 天
    统一转换成分钟
    ‘‘‘
    if ‘分钟‘ in value:
        return int(value.split(‘分钟‘)[0])
    elif ‘小时‘ in value:
        value = value.split(‘小时‘)[0]
        return int(value) * 60
    elif ‘天‘ in value:
        value = value.split(‘天‘)[0]
        return int(value) * 60 * 24

def ishidden_to_int(value):
    if ‘高匿‘ in value:
        return int(1)
    else:
        return int(0)

def check_time(value):
    return datetime.datetime.strptime(value, "%y-%m-%d %H:%M")

class ProxyIpItem(scrapy.Item):
    ‘‘‘
    {‘addr‘: ‘陕西西安‘,
     ‘check_time‘: ‘12-12-31 18:52‘,
     ‘conn_time‘: ‘0.82秒‘,
     ‘ip‘: ‘113.133.160.203‘,
     ‘ishidden‘: ‘高匿‘,
     ‘live_time‘: ‘1分钟‘,
     ‘port‘: ‘6675‘,
     ‘speed‘: ‘3.595秒‘,
     ‘type‘: ‘socks4/5‘
     }
    ‘‘‘
    ip = scrapy.Field()
    port = scrapy.Field()
    addr = scrapy.Field(
        input_processor = MapCompose(remove_tags, lambda x:x.strip())
    )
    ishidden = scrapy.Field(
        input_processor=MapCompose(ishidden_to_int)
    )
    type = scrapy.Field()
    speed = scrapy.Field()
    conn_time = scrapy.Field()
    live_time = scrapy.Field(
        input_processor = MapCompose(live_time)
    )
    check_time = scrapy.Field()

    def get_insert_sql(self):
        insert_sql = """
                    insert into proxy_ip(ip, port, addr, ishidden, type, speed, conn_time, live_time, check_time)
                    VALUES (%s, %s, %s, %s,%s,%s, %s, %s, %s)
                """
        params = (self["ip"], self["port"], self["addr"],
                  self["ishidden"], self["type"],self["speed"],
                  self["conn_time"], self["live_time"], self["check_time"])
        return insert_sql, params

在pipeline中进行数据的再次清洗,抛弃所有的特殊端口的item,并数据进行保存

在中间件中创建切换IP的中间件,在主配置文件中启用这个中间件

IP是否可用,只需要请求百度即可

验证码识别

没必要自己写一个验证码识别代码

可以使用云打码平台进行验证码识别

http://www.yundama.com/

需要分别注册一个普通用户和一个开发者账号

下载pythonhttp版本

http://www.yundama.com/apidoc/YDM_SDK.html#DLL

解压后里面有一个3.x的文件,打开后进行配置

# 用户名(普通用户)
username    = ‘username‘

# 密码(普通用户)
password    = ‘password‘                            

# 软件ID,开发者分成必要参数。登录开发者后台【我的软件】获得!
appid       = 1                                     

# 软件密钥,开发者分成必要参数。登录开发者后台【我的软件】获得!
appkey      = ‘22cc5376925e9387a23cf797cb9ba745‘    

# 图片文件
filename    = ‘getimage.jpg‘                        

# 验证码类型,# 例:1004表示4位字母数字,不同类型收费不同。请准确填写,否则影响识别率。在此查询所有类型 http://www.yundama.com/price.html
codetype    = 1004

# 超时时间,秒
timeout     = 60    

原文地址:https://www.cnblogs.com/gaoyongjian/p/9905354.html

时间: 2024-09-30 19:22:08

Scrapy突破反爬虫的限制的相关文章

第7章 Scrapy突破反爬虫的限制

7-1 爬虫和反爬的对抗过程以及策略 Ⅰ.爬虫和反爬虫基本概念 爬虫:自动获取网站数据的程序,关键是批量的获取. 反爬虫:使用技术手段防止爬虫程序的方法. 误伤:反爬虫技术将普通用户识别为爬虫,如果误伤过高,效果再高也不能用. 成本:反爬虫需要的人力和机器成本. 拦截:成功拦截爬虫,一般拦截率越高,误伤率越高. Ⅱ.反爬虫的目的 初级爬虫----简单粗暴,不管服务器压力,容易弄挂网站. 数据保护 失控的爬虫----由于某些情况下,忘记或者无法关闭的爬虫. 商业竞争对手 Ⅲ.爬虫和反爬虫对抗过程

第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略

第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲-爬虫和反爬的对抗过程以及策略-scrapy架构源码分析图 1.基本概念 2.反爬虫的目的 3.爬虫和反爬的对抗过程以及策略 scrapy架构源码分析图

Python Scrapy反爬虫常见解决方案(包含5种方法)

爬虫的本质就是“抓取”第二方网站中有价值的数据,因此,每个网站都会或多或少地采用一些反爬虫技术来防范爬虫.比如前面介绍的通过 User-Agent 请求头验证是否为浏览器.使用 JavaScript 动态加载资源等,这些都是常规的反爬虫手段. 下面针对更强的反爬虫技术提供一些解决方案. IP 地址验证 有些网站会使用 IP 地址验证进行反爬虫处理,程序会检查客户端的 IP 地址,如果发现同一个 IP 地址的客户端频繁地请求数据, 该网站就会判断该客户端是爬虫程序. 针对这种情况,我们可以让 Sc

基于C#.NET的高端智能化网络爬虫(一)(反爬虫哥必看)

前两天朋友发给我了一篇文章,是携程网反爬虫组的技术经理写的,大概讲的是如何用他的超高智商通过(挑衅.怜悯.嘲讽.猥琐)的方式来完美碾压爬虫开发者.今天我就先带大家开发一个最简单低端的爬虫,突破携程网超高智商的反爬虫技术. 一.什么是爬虫? 很多人说我们这些搞软件的人,总喜欢把虚拟世界里的事物跟现实中的东西扯上关系.这点我真不否认,脱离了现实,我们伟大的创举还有何意义? “爬虫”就是个例子,它对于我们开发人员而言,就是一段用来自动化采集网站数据的程序,结果跟现实中的虫子扯上了关系.听说是Googl

爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider)

爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider),这之间的斗争恢宏壮阔... Day 1小莫想要某站上所有的电影,写了标准的爬虫(基于HttpClient库),不断地遍历某站的电影列表页面,根据 Html 分析电影名字存进自己的数据库.这个站点的运维小黎发现某个时间段请求量陡增,分析日志发现都是 IP(1.1.1.1)这个用户,并且 useragent 还是 JavaClient1.6 ,基于这两点判断非人类后直接在Nginx 服务器上封杀.

Python爬虫?今天教大家玩更厉害的,反爬虫操作!零基础都能写!

主要针对以下四种反爬技术:Useragent过滤:模糊的Javascript重定向:验证码:请求头一致性检查.高级网络爬虫技术:绕过 "403 Forbidden",验证码等 爬虫的完整代码可以在 github 上对应的仓库里找到. 我从不把爬取网页当做是我的一个爱好或者其他什么东西,但是我确实用网络爬虫做过很多事情.因为我所处理的许多工作都要求我得到无法以其他方式获得的数据.我需要为 Intoli 做关于游戏数据的静态分析,所以我爬取了Google应用商店的数据来寻找最新被下载的AP

反爬虫和抗DDOS攻击技术实践

导语 企鹅媒体平台媒体名片页反爬虫技术实践,分布式网页爬虫技术.利用人工智能进行人机识别.图像识别码.频率访问控制.利用无头浏览器PhantomJS.Selenium 进行网页抓取等相关技术不在本文讨论范围内. Cookie是什么 大家都知道http请求是无状态的,为了让http请求从"无状态" to "有状态" , W3C 在 rfc6265 中描述了整个http协议的状态机制,既从客户端(通常是浏览器)到服务器端的流转过程,cookie 的引入使得 服务器在 接

反爬虫破解系列-汽车之家利用css样式替换文字破解方法

网站: 汽车之家:http://club.autohome.com.cn/ 以论坛为例 反爬虫措施: 在论坛发布的贴子正文中随机抽取某几个字使用span标签代替,标签内容位空,但css样式显示为所代替的文.这样不会 影响正常用户的阅读,只是在用鼠标选择的时候是选不到被替换的文字的,对爬虫则会造成采集内容不全的影响. 原理分析: 先看一下span标签的样式 截图是火狐浏览器的firebug的html面板.我们可以看到正文中每个span标签的样式都是一个文字,我们只需要找到每个 span标签的cla

网站常见的反爬虫和应对方法

这几天在爬一个网站,网站做了很多反爬虫工作,爬起来有些艰难,花了一些时间才绕过反爬虫.在这里把我写爬虫以来遇到的各种反爬虫策略和应对的方法总结一下. 从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分.这里我们只讨论数据采集部分. 一般网站从三个方面反爬虫:用户请求的Headers,用户行为,网站目录和数据加载方式.前两种比较容易遇到,大多数网站都从这些角度来反爬虫.第三种一些应用ajax的网站会采用,这样增大了爬取的难度. 通过Headers反爬虫  从用户请求的Headers反爬虫是最常