PythonScrapy爬虫被ban的一些解决办法

大多数python写爬虫都是当做工具在用,爬虫过程中都会遇到命中反爬导致无法继续访问。访问出现500或者其他服务器禁止错误,像下面这样

在这之前,默认你已经了解pythonscrapy。具体selenium的使用方法可以查阅官方文档。

我的处理办法:

  • 使用selenium打开浏览器,不再直接使用request请求url,这样看起来更像真人操作,当然你可以可以选择使用chrome以及chrome的驱动是同样的。
  • 使用fake-userAgent在每次请求前伪造UA
  • 使用代理在每次请求更换代理进行请求

开始

三个处理办法对应着三个中间件,均放在本地爬虫目录的 middlewares.py文件内

1.伪造UA

使用fake_useragent

python 复制代码
from fake_useragent import UserAgent
class RandomUserAgentMiddleware:
    def __init__(self):
        self.ua = UserAgent()
    def process_request(self, request, spider):
        # 为每个请求随机设置一个User-Agent
        request.headers.setdefault('User-Agent', self.ua.random)
2.proxy代理

代理可以自己购买,也可使用github上开源的然后在自己本地部署

  • ProxyPool
  • proxy_pool
python 复制代码
import requests
class ProxyMiddleware(object):
    def process_request(self, request, spider):
        # 设置代理的URL
        request.meta['proxy'] = "这里写你具体使用代理服务器地址如:http://127.0.0.1:1234"
3.使用Selenium
python 复制代码
from selenium import webdriver
from scrapy import signals
import random

class SeleniumMiddleware:
    def __init__(self):
        # 你在这可以选择使用chrome 或者 火狐
        # self.driver = webdriver.Chrome()
        self.driver = webdriver.Firefox()

    def process_request(self, request, spider):
        self.driver.get(request.url)
        
        # 随机停顿几秒,你可以不停顿,或者改的更长/更短的时间
        sleepSeconds = random.randint(2,6)
        time.sleep(sleepSeconds) 
        
        body = self.driver.page_source
        return HtmlResponse(url=request.url, body=body, encoding='utf-8', request=request)

    @classmethod
    def from_crawler(cls, crawler):
        middleware = cls()
        crawler.signals.connect(middleware.spider_closed,
                                signal=signals.spider_closed)
        return middleware
    
    # 在爬虫退出时关闭浏览器
    def spider_closed(self):
        self.driver.quit()

最后一步

settings中设置中间件,并关闭默认的UA中间件。需要注意的是中间件的顺序不要搞错了,后面的值表示中间件运行的顺序,Selenium在这三个里面一定是最后的,因为它就开始访问资源了

python 复制代码
DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
   "qiuzhi.middlewares.RandomUserAgentMiddleware": 200,
   "qiuzhi.middlewares.ProxyMiddleware": 300,
   "qiuzhi.middlewares.SeleniumMiddleware": 400,
}

有坑么?

大多数坑都是版本冲突的问题。因为我上次使用scrapy爬虫已经是两年前,但是在这中间时间可能在使用pandas或者其他库的时候,有更新到其他包。导致我这次运行的时候出现很多问题。如果你实在无法解决,尝试使用 --upgrade 或者 先卸载再重新安装的方式来解决

  • selenium使用时,你可能会遇到报错:显示ValueError: Timeout value connect was ......, but it must be an int, float or None

这是因为版本冲突的原因,将你的urllib3版本改成1.26.2 问题解决参考:blog.csdn.net/weixin_6053...

如果你想很好的管理你的python环境,建议使用 Aconada Navigator

作者:蛋炒饭不加冰

链接:https://juejin.cn/post/7381688991496519734

相关推荐
老K的Java兵器库几秒前
集合性能基准测试报告:ArrayList vs LinkedList、HashMap vs TreeMap、并发 Map 四兄弟
java·开发语言
枫叶丹411 分钟前
【Qt开发】多元素类控件(二)-> QTableWidget
开发语言·qt
bin915312 分钟前
当AI开始‘映射‘用户数据:初级Python开发者的创意‘高阶函数‘如何避免被‘化简‘?—— 老码农的函数式幽默
开发语言·人工智能·python·工具·ai工具
Nebula_g34 分钟前
Java哈希表入门详解(Hash)
java·开发语言·学习·算法·哈希算法·初学者
努力努力再努力wz36 分钟前
【C++进阶系列】:万字详解unordered_set和unordered_map,带你手搓一个哈希表!(附模拟实现unordered_set和unordered_map的源码)
java·linux·开发语言·数据结构·数据库·c++·散列表
励志不掉头发的内向程序员40 分钟前
【STL库】哈希表的原理 | 哈希表模拟实现
开发语言·c++·学习·散列表
万粉变现经纪人1 小时前
如何解决 pip install -r requirements.txt 私有仓库认证失败 401 Unauthorized 问题
开发语言·python·scrapy·flask·beautifulsoup·pandas·pip
量子炒饭大师1 小时前
收集飞花令碎片——C语言字符函数与字符串函数
c语言·开发语言
懂得节能嘛.1 小时前
【设计模式】Java规则树重构复杂业务逻辑
java·开发语言·设计模式