首页 技术 正文
技术 2022年11月6日
0 收藏 358 点赞 972 浏览 2736 个字

1,随机更换 user-agent:

将足够多的user-agent放在settings中,在parse方法中调用

Scrapy反爬

缺点:每一个request中都要调用这个方法

Scrapy反爬这个是scrapy的流程图。

既然每一次下载都需要通过中间件,那么为什么不写在中间件里面呢?

Scrapy反爬

scrapy怎么写呢?

在官方文档中可以知道,需要处理的是三个个方式

1,process_request(request, spider)

2,process_response(request, response, spider)

3, process_ exception(request, exception, spider)

当然在github上面已经有人写过随机更换user-agent了

在github上面搜索fake-useragent即可

Scrapy反爬

pip install fake-useragent

Scrapy反爬

首先进入python的交互环境,引入并实例化对象。

Scrapy反爬

注意的是,这个里面即使使用同一个浏览器他的useragent都是不一样的,这样就满足要求了

每一次需要指定浏览器类型还是比较麻烦,在这个里面有一个好的方法random

Scrapy反爬

>>> ua.random
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36'
>>> ua.random
'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36 Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10'
>>> ua.random
'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36'

这样他就可以随机生成浏览器的请求头了,就没有必要专门在settings中维护user-agent了

from fake_useragent import UserAgentclass RandomUserAgentMiddleware(object):
def __init__(self, crawler):
super(RandomUserAgentMiddleware, self).__init__() # 使用父类的方法来进行初始化 self.ua = UserAgent()
self.per_proxy = crawler.settings.get('RANDOM_UA_PER_PROXY', False)
self.ua_type = crawler.settings.get('RANDOM_UA_TYPE', 'random')
self.proxy2ua = {} @classmethod
def from_crawler(cls, crawler): # 传递爬虫信息
return cls(crawler) def process_request(self, request, spider):
def get_ua(): # 因为
'''Gets random UA based on the type setting (random, firefox…)'''
return getattr(self.ua, self.ua_type) # 取self.ua中的self.ua_type的值 if self.per_proxy:
proxy = request.meta.get('proxy')
if proxy not in self.proxy2ua:
self.proxy2ua[proxy] = get_ua()
logger.debug('Assign User-Agent %s to Proxy %s'
% (self.proxy2ua[proxy], proxy))
request.headers.setdefault('User-Agent', self.proxy2ua[proxy])
else:
ua = get_ua()
request.headers.setdefault('User-Agent', get_ua())

在settings中配置需要哪种类型的agent,是随机选择ie还是Firefox,还是Chrome

还是随机任意一个

RANDOM_UA_PER_PROXY = 'random'

当然在这个地方会遇到问题就是self.ua.self.ua_type还可以成立吗,当然不行,因为python是一门动态语言,支持,函数中定义函数、

相当于闭包的一个特性

2,代理IP  (尽量不要让自己本机的IP被封,因为本机IP效果最好,西刺高匿代理IP)

1,买了亚马逊等除了阿里云的服务器,动态分配IP

2,通过request.meta[‘proxy’]=”https://^^^^^^^”

3,设置代理池

如何获取呢?写个爬虫爬取西刺高匿的IP代理嘛

——————————

安装scrapy_proxies库,pip install scrapy_proxies即可,

收费的有scrapy-crawlera

或者使用tor洋葱浏览器

3,在线打码平台(云打码)

4,配置Scrapy,降低被封几率

① cookies的禁用

settings中有一个参数,COOKIES_ENABLED = True,对于一些不需要登录的网站就可以设置为False,但是对于像知乎之类的需要登录的网站就不行

② 控制下载的速度

https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/autothrottle.html

AUTOTHROTTLE_ENABLED = True  # 如果设置为False的话,默认不开启间隔下载
DOWNLOAD_DELAY = 3 # 默认下载时间3s

③ 根据不同的spider设定不同的settings值

Scrapy反爬

我们在源码中可以看到,这里面有个custom_settings默认为None

Scrapy反爬

在update_settings这个类方法中可以看到类调用了custom_settings,所以,我们可以根据不同的爬虫,在settings中定制不同的custom_settings

把所需要的参数给传递进去即可。

custom_settings = {
"COOKIES_ENABLED": True
}

Scrapy反爬

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,088
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,564
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,413
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,186
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,822
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,905