1.通过动态设置user agent字段设置headers属性来模拟成浏览器
http请求头中user agent包含了我们使用的浏览器和操作系统的一些信息,很多网站通过判断user agent内容来确定用户的,所以咱们要动态设置user agent,来假装自己是很多用户。主要有如下两种方法:
- 使用build_opener()修改报头(由于urlopen()不支持一些HTTP的高级功能如验证、cookie等),所以要修改报头可以使用urllib.request.build_opener()进行,代码示例如下:
import urllib.request
url="http:blog.csdn.net/weiwei_pig/article/details/51178226"
headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0")
#headers存储对应的User-Agent信息,格式即("User-Agent":具体信息)
opener=urllib.request.build_opener()#创建自定义的opener对象并赋给变量opener
opener.addheaders=[headers]#设置对应的头信息,设置格式即:“opener对象名.addheaders=[头信息]”
#注意是addheaders末尾有s
data=opener.open(url).read()#打开具有头信息的url
- 使用add_header()添加报头即使用urllib.request.Request()下的add_header() 代码实例如下:
import urllib.request
url="http:blog.csdn.net/weiwei_pig/article/details/51178226"
req=urllib.request.Request(url) #创建一个Request对象赋给变量req
req.add_header('User-Agent',"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0")#用add_header()方法添加包头信息,格式即Requestdui'xiang'm,注意末尾无s,是add_header()
data=urllib.request.urlopen(req).read()#打开Request对象即可打开对应网址并读取网页内容赋给data变量
2.以下为scrapy中常用的反爬技术
- 禁用cookie,(禁用本地cookie让对方网站无法识别出我们的会话消息)即,在setting.py中下句的注释去掉即可
COOKIES_ENABLED=False
设置下载延迟(有的网站会通过我们对网页的访问频率进行分析若爬去频率过快,则判断为爬虫自动爬去行为),所以可以控制下爬虫时间间隔,即在对应scrapy中的setting.py中解除下句的注释:
DOWNLOAD_DELAY=2 #2代表下载间隔2秒
- 使用IP池(有的网站会对用户ip检测,若同一个ip对服务器上的网页进行大量爬取,可以被识别为网络爬虫的额自动爬去行为,会封禁该IP,因为ip资源有限)比如可以使用不同的代理服务器获得不同的ip组成一个ip池,对于scrapy而言,我们需要为爬虫项目建立一个下载中间件,在下载中间件中设置好IP选择规则,在setting.py中配置好下载中间件并配置好IP池,具体实例如下:
- 先在项目核心目录下创建下载中间件文件,文件名自定义,比如:
D:\python3.5\myweb\part12\myfirstpjt>cd myfirstpjt\ #先找到所在目录
D:\python3.5\myweb\part12\myfirstpjt\myfirstpjt>echo #>middlewares.py #后面的命令即创建下载中间件文件,名为middlewares.py
因为需要大量的ip所以可以通过代理服务器解决,可以通过http://yum.iqianyue.com/proxy 找到代理也可以自己网上搜索,找到这些代理服务器的ip信息后
- 在setting.py文件中将这些代理服务器的IP设置为ip池,即如下所示:
#IP池设置
IPPOOL=[{ "ipaddr":"121.33.226.167:3128"},
{ "ipaddr":"118.187.10.11:80"},
{ "ipaddr":"12.43.56.167:808"},
{ "ipaddr":"21.133.22.16:47800"},
{ "ipaddr":"171.39.26.17:80"}
] #即外层通过列表形式存储,内部字典形式存储
- 设置好ip池后,编写下载中间件文件(在scrapy中与代理服务器相关的下载中间件是HttpProxyMiddleware,同样在scrapy官方文档中HttpProxyMiddleware对应的类是
class scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware所以编辑下载中间件文件时需要导入scrapy.contrib.downloadermiddleware.httpproxy下HttpProxyMiddleware)即如下所示:
#middlewares下载中间件
#导入随机数模块,目的是随机挑选一个IP池中的IP
import random
#从settings文件中导入设置好的IPPOOL
from myfirstpjt.settings import IPPOOL
#导入官方文档中HttpProxyMiddleware对应的模块
from scrapy.contrib.downloadermiddleware.httpproxy import HttpProxyMiddleware
class IPPOOLS(HttpProxyMiddleware):
#初始化方法
def __init__(self,ip=''):
self.ip=ip
#process_request()方法,主要进行请求处理
def process_request(self,request,spider):
#先随机选择一个ip
thisip=random.choice(IPPOOL)
#输出当前选择的ip
print ("当前使用的ip是:"+thisip["ipaddr"])
#将对应的ip实际添加为具体的代理,用该ip进行爬取
request.meta["proxy"]="http://"+thisip["ipaddr"]
此时即为编辑好了中间件文件
- 为了使中间件生效,需要激活下载中间件,,将其加入到
DOWNLOADER_MIDDLEWARES
设置中。该设置是一个字典(dict),键为中间件类的路径,值为其中间件的顺序(order)。即在setting.py文件中中间件的配置修改为如下信息:
DOWNLOADER_MIDDLEWARES={
#'myfirstpjt.middlewares.MyCustomDownloadermiddleware':543
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware':123
'myfirstpjt.middlewares.IPPOOLS':125
} #数字越小的中间件越靠近引擎,数字越大的中间件越靠近下载器,格式即"下载中间件所在目录.下载中间件文件名.下载中间件内部要使用的类":orders
由此即可运行爬虫文件如:
D:\Python3.5\myweb\part12\myfirstpjt\myfirstpjt> scrapy crawl weisuen --nolog
4. 使用用户代理池(网站服务器识别爬行的用户代理信息由此可以判断出我们是什么浏览器以及客户端)
与ip代理池类似需要收集多种浏览器的信息由此建立一个用户代理池再建立一个下载中间件)即如下:
- 在setting.py文件中设置好用户代理池,如下:
#用户代理池设置
UAPOOL
=["Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"
]
- 创建一个下载中间件的文件(注意:ip代理池使用的下载中间件类型为HttpProxyMiddleware,对应的类为class scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware,用户代理池中间件类型为UserAgentMiddleware,对应的类为class scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware)即如下所示:
D:\python3.5\myweb\part12\myfirstpjt\myfirstpjt>echo #>uamid.py
- 编辑该中间件文件,如下所示:
#uamid 下载中间件
import random
from myfirstpjt.settings import UAPOOL
from scrapy.contrib.downloadermiddleware.useragent import UserAgentMiddleware
class Uamid(UserAgentMiddleware):
def__init__(self,ua=''):
self.ua=ua
def process_request(self,request,spider):
thisua=random.choice(UAPOOL)
print("当前使用的user-agent是:"+thisua)
request.headers.setfefault('User-Agent',thisua)
- 激活代理的下载中间件即在setting.py中设置如下:
# Enable or disable downloader middleware
DOWNLOADER_MIDDLEWARES={
#'myfirstpjt.middlewares.MyCustomDownloadermiddleware':543
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware':2,
'myfirstpjt.uamid.Uamid':1
}- 设置好之后就可以运行了
3.除此之外还可以使用谷歌Cache、使用分布式爬行等方式(分布式爬行中常用的是通过scrapinghub旗下的框架进行)
ps:对别人的网站进行爬取的时候需要遵守道德,遵守robots协议