在scrapy项目中,如何应对反爬虫机制?
01-简述主要方法
- 禁止Cookie
- 设置下载延迟时
- 使用IP池
- 使用用户代理池
- 其他方法如进行分布式爬取
02-禁止Cookie
原理:网站会通过Cookie信息对用户进行识别和分析,此时如果我们禁止本地Cookie信息让对方网站无法识别出我们的会话信息。
------settings COOKIES_ENABLED = False
03-设置下载延迟
原理:网站会通过我们对网页的访问频率进行分析,此时我们只需要控制一下爬行的时间间隔。
------settings DOWNLOAD_DELAY = 3
#3代表3秒
04-设置IP池
- 原理:网站会对用户的IP进行检测,如果同意IP在短时间内对自己服务器上的页面进行大量爬去,就可以封其IP。
- 破解:利用不同代理服务器可以获取不同的IP,此时我们可以获取多个代理服务器,将这些代理服务器的IP组成一个IP池,每次爬取网页时可以随机选取IP池中的一个IP进行爬取。
- 操作:在Scrapy项目中建立一个下载的中间件,在下载的中间件中设置好IP选择规则,在settings.py设置中配置好下载的中间件,并配置好IP池。
#第一步创建中间件文件
cd 文件夹
echo #>middlewares.py
#第二步编辑settings的IP代理池(http://yum.iqianyue.com/proxy)
------settings通过字典形式储存。
IPPOOL=[
{"ipaddr":"121.33.226.167:3128"},
{"ipaddr":"121.33.226.167:3128"},
{"ipaddr":"121.33.226.167:3128"},
{"ipaddr":"121.33.226.167:3128"},
{"ipaddr":"121.33.226.167:3128"},
]
#第三步编辑中间件文件
import random
from qianmu.settings import IPPOOL
from scrapy.contrib.downloadermiddleware.httpproxy import HttpProxyMiddleware
class IPPOOLS(HttpProxyMiddleware):
def __init__(self,ip=''):
self.ip = ip
def process_request(self, request, spider):
thisip = random.choice(IPPOOL)
request.meta["proxy"] = "http://"+thisip["ipaddr"]
#第四步更改默认的下载中间件为我们自己写的中间件---settings
默人
#DOWNLOADER_MIDDLEWARES = {
# 'qianmu.middlewares.MyCustomDownloaderMiddleware': 543,
#}
改为
DOWNLOADER_MIDDLEWARES = {
#'qianmu.middlewares.MyCustomDownloaderMiddleware': 543,
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware':123,
'myfirstpjt.middlewares.IPPOOLS':125
}
05-使用用户代理池
- 原理:网站服务器分析用户信息。
- 破解:同上
# 01-设置用户代理池
UPPOOL = [
"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393"
]
# 02-创建下载中间文件uamid.py(与settings.py同一个目录)
# -*- coding: utf-8 -*-#
# 导入随机模块
import random
# 导入settings文件中的UPPOOL
from .settings import UPPOOL
# 导入官方文档对应的HttpProxyMiddleware
from scrapy.contrib.downloadermiddleware.useragent import UserAgentMiddleware
class Uamid(UserAgentMiddleware):
# 初始化 注意一定要user_agent,不然容易报错
def __init__(self, user_agent=''):
self.user_agent = user_agent
# 请求处理
def process_request(self, request, spider):
# 先随机选择一个用户代理
thisua = random.choice(UPPOOL)
print("当前使用User-Agent是:"+thisua)
request.headers.setdefault('User-Agent',thisua)
#03-在settings.py中配置下载中间件
# 配置下载中间件的连接信息
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': 2,
'modetest.uamid.Uamid': 1
}
配置文件:
# 设置IP池和用户代理
# 禁止本地Cookie
COOKIES_ENABLED = False
# 设置IP池
IPPOOL = [
{"ipaddr": "221.230.72.165:80"},
{"ipaddr": "175.154.50.162:8118"},
{"ipaddr": "111.155.116.212:8123"}
]
# 设置用户代理池
UPPOOL = [
"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393"
]
# 配置下载中间件的连接信息
DOWNLOADER_MIDDLEWARES = {
#'scrapy.contrib.downloadermiddlewares.httpproxy.HttpProxyMiddleware':123,
#'modetest.middlewares.IPPOOlS' : 125,
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': 2,
'modetest.uamid.Uamid': 1
}
06-其他方法
例如使用谷歌的cache,使用分布式爬虫中常见的scrapinghub旗下的框架