Scrapy框架中的反爬机制

在Scrapy框架中,面对网站的反爬机制,可以采用以下多种方法来进行处理:

 

使用代理

 

- 代理的原理及作用:通过代理服务器来发送请求,这样目标网站看到的请求源IP就变成了代理服务器的IP,而非你真实的IP地址,有助于绕过基于IP的访问限制等反爬手段。

- 在Scrapy中配置代理的示例:

- 可以在  settings.py  文件中进行设置,比如使用付费代理服务(以下以  http://user:password@proxy_ip:proxy_port  格式为例,实际中替换为真实的代理账号、密码、IP和端口):

 

DOWNLOADER_MIDDLEWARES = {

    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,

}

PROXY_LIST = [

    "http://user:password@proxy_ip:proxy_port"

]

 

 

- 或者如果使用免费的公开代理(不过其稳定性和速度通常较差),可编写一个中间件动态从代理列表里获取代理并设置,示例中间件代码如下:

 

import random

from scrapy.downloadermiddlewares.httpproxy import HttpProxyMiddleware

 

 

class RandomProxyMiddleware(HttpProxyMiddleware):

    def __init__(self, proxy_list):

        self.proxy_list = proxy_list

 

    @classmethod

    def from_crawler(cls, crawler):

        return cls(

            proxy_list=crawler.settings.get('PROXY_LIST')

        )

 

    def process_request(self, request, spider):

        proxy = random.choice(self.proxy_list)

        request.meta['proxy'] = proxy

 

 

然后在  settings.py  中添加:

 

PROXY_LIST = [

    "http://free_proxy_ip_1:free_proxy_port_1",

    "http://free_proxy_ip_2:free_proxy_port_2",

    # 可添加多个免费代理IP地址

]

DOWNLOADER_MIDDLEWARES = {

    'your_project_name.middlewares.RandomProxyMiddleware': 100,

    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,

}

 

 

设置合理的请求头(Headers)

 

- 请求头的重要性:网站可以通过分析请求头中的信息(如  User-Agent  字段,代表客户端类型等)来判断请求是否来自正常浏览器访问还是爬虫程序。模拟真实浏览器的请求头,能提高爬虫的伪装性,降低被识别为爬虫的概率。

- 在Scrapy中的设置方法:

- 在  settings.py  文件中添加,例如模拟常见浏览器的  User-Agent :

 

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/520.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'

 

 

- 也可以编写中间件动态随机设置不同的  User-Agent ,首先准备一个包含多个不同  User-Agent  字符串的列表(可以从网上搜集一些常见的),示例中间件代码如下:

 

import random

 

 

class RandomUserAgentMiddleware(object):

    def __init__(self, user_agents):

        self.user_agents = user_agents

 

    @classmethod

    def from_crawler(cls, crawler):

        return cls(

            user_agents=crawler.settings.get('USER_AGENT_LIST')

        )

 

    def process_request(self, request, spider):

        request.headers['User-Agent'] = random.choice(self.user_agents)

 

 

然后在  settings.py  中配置:

 

USER_AGENT_LIST = [

    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',

    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36',

    # 更多不同的User-Agent字符串

]

DOWNLOADER_MIDDLEWARES = {

    'your_project_name.middlewares.RandomUserAgentMiddleware': 100,

}

 

 

控制请求频率

 

- 避免频繁请求的原因:如果爬虫短时间内对目标网站发起大量请求,很容易触发网站的反爬机制,例如被限制IP访问等。合理控制请求频率,使其接近正常用户的访问速度,有助于降低被发现的风险。

- 在Scrapy中的实现方式:

- 使用  DOWNLOAD_DELAY  设置下载延迟,即每次请求之间的间隔时间(单位为秒),比如设置为2秒,表示每2秒发送一次请求,在  settings.py  文件中添加:

 

DOWNLOAD_DELAY = 2

 

 

- 还可以结合  RANDOMIZE_DOWNLOAD_DELAY  来随机化这个延迟时间,让请求频率看起来更自然,同样在  settings.py  文件中配置:

 

DOWNLOAD_DELAY = 2

RANDOMIZE_DOWNLOAD_DELAY = True

 

 

处理验证码或登录限制

 

- 应对验证码情况:如果网站弹出验证码来验证访问者是否为人类,可采用验证码识别技术(如使用一些开源的验证码识别库,不过准确率因验证码复杂程度而异),或者使用打码平台(付费服务,由人工帮忙识别验证码)。例如使用打码平台,在Scrapy中需要编写相应的中间件,当遇到验证码页面时,将验证码图片发送给打码平台,获取识别结果后继续后续请求流程。

- 应对登录限制:若网站只有登录后才能访问更多内容,需要先模拟登录过程。可以使用Scrapy的  FormRequest  来模拟表单提交登录信息,示例代码(以常见的用户名、密码登录为例)如下:

 

import scrapy

 

 

class LoginSpider(scrapy.Spider):

    name = "login"

    start_urls = ["https://example.com/login_page"]

 

    def parse(self, response):

        return scrapy.FormRequest.from_response(

            response,

            formdata={'username': 'your_username', 'password': 'your_password'},

            callback=self.after_login

        )

 

    def after_login(self, response):

        # 登录成功后,这里可以继续发起对需要登录才能访问页面的请求等后续操作

        if "登录成功提示信息" in response.text:

            self.logger.info("登录成功")

            # 例如继续爬取某个需要登录权限的页面

            yield scrapy.Request("https://example.com/protected_page", callback=self.parse_protected_page)

        else:

            self.logger.error("登录失败")

 

 

使用缓存

 

- 缓存的好处:避免重复向目标网站请求相同的数据,减少不必要的请求次数,提高爬虫效率的同时也能一定程度上降低触发反爬机制的可能性。

- 在Scrapy中的配置示例:可以启用Scrapy自带的缓存机制,在  settings.py  文件中添加:

 

HTTPCACHE_ENABLED = True

HTTPCACHE_EXPIRATION_SECS = 0 # 缓存过期时间,0表示永不过期(可根据实际需求调整)

HTTPCACHE_DIR = 'httpcache' # 缓存数据存储的目录

HTTPCACHE_IGNORE_HTTP_CODES = [] # 可以指定忽略哪些状态码不进行缓存

HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

 

 

通过综合运用以上这些方法,可以在一定程度上提高Scrapy爬虫应对反爬机制的能力,使其能够更稳定、高效地获取目标网站的数据。不过要始终记得遵循相关法律法规以及目标网站的使用规则来开展爬虫活动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值