python爬虫大数据 爬虫Python AI SqlPython数据采集与爬虫

【小白学爬虫连载(13)】--Scrapy如何突破反爬虫

2018-05-30  本文已影响51人  哈希大数据

欢迎大家关注公众号【哈希大数据】
之前我们分享了如何用Python实现模拟登陆网站如何获取免费高匿代理IP,模拟登陆网站和利用大量代理IP爬取网站的方式可以较好的实现突破反爬虫,本次分享想给大家介绍scrapy框架突破发爬虫的4种策略,具体哪四种请看正文。
在学习这部分内容时看到了下面这张图展示了爬虫与网站之间的斗智斗勇,觉得挺有意思分享给大家(如有侵权请联系,我会及时删除):

image

从这张图中我们可以看出反爬虫主要是从User-agent、IP、爬取速度、cookie这几个方面判断爬虫与人为浏览的区别。所以我们可以从以下四个方面给出对应的策略:

下面我们来看看scrapy如何实现这几种策略。

1、动态设置User-agent

前面我们分享过scrapy架构设计分析,里面讲了scrapy主要由5个模块、2个中间件组成,这里不再展开来讲,user-agent的设置一般放在Middleware中间件中,因为在发送请求时需提供user-agent,DownloadMiddlewares负责修改requests请求的参数值,middleware.py文件中user-agent设置代码如下:

class RotateUserAgentMiddleware(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:            request.headers.setdefault('User-Agent', ua)    #the default user_agent_list composes chrome,IE,firefox,Mozilla,opera,netscape    #for more user agent strings,you can find it in http://www.useragentstring.com/pages/useragentstring.php    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",]

2、设置代理IP、VPN

设置代理IP同样是在中间件中,之前我们有介绍如何获取高匿IP,当时我们获取到的IP是保存在txt文件中的,并不利于代理IP的实时获取,删除以及新增,所以最好时保存在数据库中,数据库可以用MySQL、MongoDB等。之所以需要频繁的删除新增是因为,这些公开的高匿IP很多人都在用,所以有可能很快就被封了,所以在项目中使用的话尽量购买代理ip。在middleware.py文件中HttpProxy中间件设置代码如下:

class HttpProxyMiddleware(object):    # proxys_ip.txt为我存放IP的文件。    with open('proxys_ip.txt', 'r', encoding='utf-8') as f:        ips = f.readlines()    def test_proxy(proxy):        proxies = {            'http': 'http://' + proxy,            'https': 'https://' + proxy,        }        try:            response = requests.get(TEST_URL, proxies=proxies, verify=False, timeout=20)            if response.status_code == 200:                print('Successfully', proxy)                return True            else:                print('Useless', proxy)                return False        except Exception:            print('Useless', proxy)            return False    def process_request(self, request, spider):        self.logger.debug('Using Proxy')        random_ip = ''        for proxy in self.ips:            if proxy and self.test_proxy(proxy):                random_ip = proxy            else:                self.ips.remove(proxy)        # 刷新获取的ip,剔除掉那些不能用的        with open('proxys_ip.txt', 'w+', encoding='utf-8') as f:            f.write('\n'.join(self.ips))        if random_ip:            request.meta['proxy'] = 'http://{proxy}'.format(proxy=random_ip)            request.meta['proxy'] = 'https://{proxy}'.format(proxy=random_ip)            # request.meta['download_timeout'] = 20            self.logger.debug('Using Proxy:' + random_ip)        else:            self.logger.debug('NO Voide IP')

3、4设置下载延迟、禁用cookies

设置下载延迟和禁用cookies这两个比较简单,主要是在settings.py文件中,做一下修改:

DOWNLOAD_DELAY=3 #减慢下载速度,3指的是网页求取时间间隔是3秒COOKIES_ENABLED=False #禁用cookies

完成以上设置后,还有一项非常重要的工作,在settings.py文件中设置DOWNLOADER_MIDDLEWARES,如下所示:

DOWNLOADER_MIDDLEWARES = {    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None,    'project_name.middlewares.HttpProxyMiddleware': 543,  #“project_name”你的项目名称    'project_name.middlewares.RotateUserAgentMiddleware': 400,}

小结
本次分享主要介绍了scrapy如何突破反爬虫限制,这里主要给大家介绍了四种策略:

当然这四种策略不止适用于scrapy框架,它适用于所有爬虫,只是代码不同。下次会分享利用scrapy框架借助搜狗微信爬取微信中的文章这一实例,其中会用到本次分享所提到的几种反爬虫策略,希望通过一个实例引导初学者快速上手,又好又快的实现自己的爬虫。

上一篇 下一篇

猜你喜欢

热点阅读