茂汶论坛
Would you like to react to this message? Create an account in a few clicks or log in to continue.

如 何 使 爬 虫 更像人

向下

如 何 使 爬 虫 更像人 Empty 如 何 使 爬 虫 更像人

帖子  小鱼啊 周四 五月 04, 2017 2:24 am

如何使爬虫更像人作业思路昨天在尝试了几次拉勾网的爬取,因为调试了几次后运行,然后IP就被封了谷歌了一番,发现谷歌上还是比较少关于这方面的教程,要么是重复,要么是一笔带过,心塞……
进入正题:一个爬虫如何反Ban?
让请求更像是浏览器发出的之前只是用了一个默认的头,这样很容易被网站给识别出来,毕竟你一个浏览器短时间发出这么多请求,非人也,所以可以联想到用很多个浏览器,这样就降低了一个浏览器发出请求的数量,看起来合理了那么些,列出很多浏览器的头,然后随机选,头哪里来呢?这里推荐一个网站代码在这里:
# -*-coding:utf-8-*-

import random
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
#初始化头

self.user_agent = user_agent

#通过random函数,随机选择头,然后伪装请求

DOWNLOADER_MIDDLEWARES = {
 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,
 'lagou.middlewares.RotateUserAgentMiddleware':400,
}

让手速慢一点一个爬虫一秒钟请求N次,这不就是告诉别人说:“你看,我是爬虫,我的手速有多快呀”,然后ban的就是你这只爬虫,所以可以设置一下下载延迟(setting.py):
DOWNLOAD_DELAY = 1,虽然是慢一点,但是稳定,保险。
多个地点一起请求如何来改变自己请求的地点?一般来说,我们的IP地址就是我们的地理位置标签,所以只要改变我们的IP,就可以改变我们请求的位置,随机IP请求,就能够模拟出来自全国各地的用户来访问。
所以在这里就需要用到代理IP池了,代理IP可以在通过网站上提供的,更多代理IP请点我
具体如何实现呢?
分析:
在注释中提到request.meta,先来探究一下request.meta中到时有哪些东西,用scrapy shell测试了一下,所返回的内容是:
{'depth': 0,
 'download_latency': 16.514000177383423,
 'download_slot': 'docs.python-requests.org',
 'download_timeout': 180.0,
 'handle_httpstatus_list': <scrapy.utils.datatypes.SequenceExclude at 0x45a84b0>,
 'proxy': 'http://125.73.40.123:8118'}
 
 
 如何来获取代理IP
 提供获取代理IP的网址 http://www.xicidaili.com 这里来说一下如何批量采集这些IP代理地址。
 编写脚本:
 
 但是,问题也来了,如何保证这些IP都是有用的呢?所以需要验证一下代理IP是否有用

 验证代理IP是否有效
 计算了一下页面上所有的个数,这个个数只和总数相差不超过5个,相较于第一次爬取的结果为50多个好了很多。

 作业中的问题

 啊...这是学爬虫来研究的最久的一篇...
 还有两个问题没有解决

 问题一:

 上面的代码

 encoded_user_pass = base64.encodestring(proxy['user_pass'])
 #Base64是一种基于64个可打印字符来表示二进制数据的表示方法
 request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass
 为什么要加encoded_user_pass = base64.encodestring(proxy['user_pass'])

 问题二:

 在采用了代理IP后,测试过了,正式爬取的时候,还是有一些IP会有这样的信息显示

小鱼啊

帖子数 : 3225
注册日期 : 14-07-06

返回页首 向下

返回页首


 
您在这个论坛的权限:
不能在这个论坛回复主题