scrapy 反扒措施

Posted shaozheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scrapy 反扒措施相关的知识,希望对你有一定的参考价值。

scrapy 反扒措施

反措施:

1.临时或永久封禁来访ip

2.返回验证码

3.异步加载(ajax)

4.爬虫陷阱

5..加速乐的服务:在访问之前先判断客户端的cookie正不正确。如果不正确,返回521状态码,set-cookie并且返回一段js代码通过浏览器执行后又可以生成一个cookie,只有这两个cookie一起发送给服务器,才会返回正确的网页内容。

6.javascript渲染:网页开发者将重要信息放在网页中但不写入html标签中,而浏览器会自动渲染<script>标签的js代码将信息展现在浏览器当中,而爬虫是不具备执行js代码的能力,所以无法将js事件产生的信息读取出来


制作措施:

1.设置等待时间:

	直接:导入time,然后限制时间为正常人浏览时间
    
2.识别验证码:

	机器识别:调用在线验证码识别软件接口识别验证码,正确率百分之八九十以
    
3.异步加载:

	① fiddler / wireshark抓包分析ajax请求的界面,再通过规律仿造服务器构造一个请求访问服务器得到返回的真实数据包。

	②?通过PhantomJS+Selenium模拟浏览器行为,抓取经过js渲染后的页面。phantomjs是一个无头无界面浏览器,使用selenium可以驱动它模拟浏览器的一切操作,但缺点也很明显,爬取效率低
    
 4.爬虫陷阱:

	一般是比较简单的死循环,可以对爬虫将要爬取的链接进行判断,不重复爬取相同的页面。除此之外,对于特定的元素看清之后小心爬取,还可使用scrapy的LinkExtractor设定unique参数为True即可或者直接设定爬虫的最大循环次数。
    
 5.针对用户行为:

	① cookie禁用:对于一些不需要登录的网站,可以在setting.py文件中设置COOKIES_ENABLED = False

	②?自动限速:在setting.py文件中设置DOWNLOAD_DELAY = 1

	③判断header:在请求时构造一个header,每次url请求更换一次user-agent。可以百度,也可看看之前的文章

	④ 采用代理IP:可以做一个IP代理池,每次运行时随机挑选一个做访问IP。IP代理有收费有免费,看情况使用


  6.scrapy和redis分布式爬虫:

    可以利用多台机器的宽带加速爬取,还有利用多台机器的ip加速爬取

    一般步骤如下:

        1.基本的http抓取工具,如scrapy
        2.避免重复抓取网页,如Bloom Filter
        3.维护一个所有集群机器能够有效分享的分布式队列
        4.将分布式队列和Scrapy结合

        5.后续处理,网页析取(python-goose),存储(Mongodb)

8.加速乐:

    将浏览器返回的js代码放在一个字符串中,然后利用nodejs对这段代码进行反压缩,然后对局部的信息进行解密,得到关键信息放入下一次访问请求的头部中。

测试代理是否可用:

import urllib
 
import requests
 
import sys
 
if __name__ == "__main__":
    for url in sys.stdin:
        resp = requests.get(url)
        if resp.status_code ==requests.codes.ok:
            print(url)

识别爬虫:

http日志和流量分析,如果单位时间内某个IP访问频率和流量超过特定阈值就可以界定为爬虫。

Headers参数检测

检测User-Agent或者Referer参数的值来判断是否为爬虫,顺便提一下Referer参数也可以防盗链

在网页源码内放置一个对浏览器不可见的链接,正常用户使用浏览器是看不到该链接的当然也不会去点击,如果检测到该链接被点击,来访IP就会被界定为爬虫。



高匿代理IP解决

验证码识别 --. 人工打码平台

滚动条滑到最底部才能继续浏览下一页内容,此时可以使用selenium+phantomjs解决,phantomjs是一个无头无界面浏览器,使用selenium可以驱动它模拟浏览器的一切操作,但缺点也很明显,爬取效率低

对爬虫将要爬取的链接进行判断,不重复爬取相同的页面,scrapy的LinkExtractor设定unique参数为True即可或者直接设定爬虫的最大循环次数
	

实战:

from scrapy import log
import logging

import random
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
class UserAgent(UserAgentMiddleware):

    def __init__(self, user_agent=‘‘):
        self.user_agent = user_agent

    def process_request(self, request, spider):
        ua = random.choice(self.user_agent_list)
        if ua:
            #显示当前使用的useragent
            #print "********Current UserAgent:%s************" %ua
            #记录
            log.msg(‘Current UserAgent: ‘+ua, level=logging.DEBUG)
            request.headers.setdefault(‘User-Agent‘, ua)

    user_agent_list = [        "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; CrOS 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"
       ]

代理:

import random, base64


class ProxyMiddleware(object):
    #代理IP列表
    proxyList = [         ‘114.231.158.79:8088‘,
        ‘123.233.153.151:8118‘
        ]

    def process_request(self, request, spider):
        # Set the location of the proxy
        pro_adr = random.choice(self.proxyList)
        request.meta[‘proxy‘] = "http://" + pro_adr

settings.py:

ROBOTSTXT_OBEY = False

ITEM_PIPELINES = {
   ‘ip_proxy_pool.pipelines.IpProxyPoolPipeline‘: 300,
}

#爬取间隔
DOWNLOAD_DELAY = 1

# 禁用cookie
COOKIES_ENABLED = False

# 重写默认请求头
DEFAULT_REQUEST_HEADERS = {
  ‘Accept‘: ‘text/html, application/xhtml+xml, application/xml‘,
  ‘Accept-Language‘: ‘zh-CN,zh;q=0.8‘,
  ‘Host‘:‘ip84.com‘,
  ‘Referer‘:‘http://ip84.com/‘,
  ‘X-XHR-Referer‘:‘http://ip84.com/‘
}

#激活自定义UserAgent和代理IP
# See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {
   ‘ip_proxy_pool.useragent.UserAgent‘: 1,
   ‘ip_proxy_pool.proxymiddlewares.ProxyMiddleware‘:100,
   ‘scrapy.downloadermiddleware.useragent.UserAgentMiddleware‘ : None,
}

以上是关于scrapy 反扒措施的主要内容,如果未能解决你的问题,请参考以下文章

scrapy框架设置代理

scrapy按顺序启动多个爬虫代码片段(python3)

对于简单的反扒

python干货:5种反扒机制的解决方法

经验分享python干货:5种反扒机制的解决方法

Scrapy Spider没有返回所有元素