Scrapy使用随机User-Agent爬取网站

在爬虫爬取过程中,我们常常会使用各种各样的伪装来降低被目标网站反爬的概率,其中随机更换User-Agent就是一种手段。

在scrapy中,其实已经内置了User-Agent中间件:

class UserAgentMiddleware(object):
    """This middleware allows spiders to override the user_agent"""

    def __init__(self, user_agent='Scrapy'):
        self.user_agent = user_agent

    @classmethod
    def from_crawler(cls, crawler):
        o = cls(crawler.settings['USER_AGENT'])
        crawler.signals.connect(o.spider_opened, signal=signals.spider_opened)
        return o

    def spider_opened(self, spider):
        self.user_agent = getattr(spider, 'user_agent', self.user_agent)

    def process_request(self, request, spider):
        if self.user_agent:
            request.headers.setdefault(b'User-Agent', self.user_agent)

上面是scrapy自带的UserAgentMiddleware中间件,通过代码可以发现,如果我们没有在setting配置文件中设置headers的User-Agent,scrapy会把User-Agent设置为”Scrapy”。

原理

当我们通过 spider yield 一个 request 的时候,首先通过 spider middlewares 到达 scrapy engine,然后 engine 将 request 放到 scheduler 的队列中,通过 scheduler 调度队列中的 request ,scheduler 选中一个 request 后,将 request 通过 engine 传递给 downloader,在这之前,必然会经过 downloader middlewares,downloader 下载好之后,将 response 返回给 engine,engine 在将 response 返回给 spider,我们就可以在 spider 中调用 callback 进行解析,简单的流程大概就是这样。

那么,我们在将 request 提交给 downloader 进行下载之前,就需要将 User-Agent 进行变化,也就是每次都需要随机取一个 User-Agent 提交到 downloader 进行下载。在提交到 downloader 的时候,必然会经过 downloader middlewares,所以我们实现随机获取 User-Agent 的逻辑部分,可以在 downloader midllewares 这里实现。

第一种方法

可以把多个User-Agent作为一个配置在setting文件中

user_agent_list = [
    "ua1",
    "ua2",
    "ua3",
]

然后再编写downloader midllewares

class RandomUserAgentMiddleware(object):
    def __init__(self, crawler):
        super(RandomUserAgentMiddleware, self).__init__()
        self.user_agent_list = crawler.get("user_agent_list", [])

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler)

    def process_request(self, request, spider):
        #方法1
        request.headers.setdefault("User-Agent", random.choice(self.user_agent_list))
        #方法2
        request.headers['User-Agent'] = random.choice(self.user_agent_list)

settings.py中的配置方法:

DOWNLOADER_MIDDLEWARES = {
    'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,
    'crawl_spider.middlewares.RandomUserAgentMiddleware': 543,
}

先把scrapy自带的UserAgentMiddleware置为None,再增加我们自己写的中间件便可,

这样做可以实现切换User-Agent的功能,但是第一需要自己维护一个大的User-Agent list在配置文件中,第二就是有局限性,毕竟维护的User-Agent不会有那么的大而全,所以这里介绍另一种方法。

第二种方法(推荐)

fake-useragent 这个库提供了我们随机选择useragent的功能。
感兴趣的同学可以深入研究下源码,源码很简单,这里只介绍怎么在scrapy中使用它。

class RandomUserAgentMiddleware(object):
    def __init__(self, crawler):
        super(RandomUserAgentMiddleware, self).__init__()
        self.ua = UserAgent()
        self.ua_type = crawler.settings.get("RANDOM_UA_TYPE", "random")

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler)

    def process_request(self, request, spider):
        def get_ua():
            return getattr(self.ua, self.ua_type)
        request.headers['User-Agent'] = get_ua()

首先我们在setting配置文件中设置一个变量RANDOM_UA_TYPE,它的功能是可以按照我们自己配置的值来选择useragent。

# 随机选择UA
RANDOM_UA_TYPE = "random"
# 只选择ie的UA
RANDOM_UA_TYPE = "ie"

当然了,最终我们还要把我们的RandomUserAgentMiddleware中间件配置到setting中:

DOWNLOADER_MIDDLEWARES = {
    'crawl_spider.middlewares.RandomUserAgentMiddleware': 543,
}

至此,完成了scrapy加随机User-Agent的需求。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Scrapy框架智联招聘网站职位信息的示例代码: 1. 创建Scrapy项目 在命令行中输入以下命令,创建一个名为`zhaopin`的Scrapy项目: ``` scrapy startproject zhaopin ``` 2. 创建虫文件 在项目根目录下,使用以下命令创建一个名为`zhaopin_spider`的虫文件: ``` scrapy genspider zhaopin_spider sou.zhaopin.com ``` 3. 修改虫代码 打开`zhaopin_spider.py`文件,将其修改为以下代码: ```python import scrapy class ZhaopinSpiderSpider(scrapy.Spider): name = 'zhaopin_spider' allowed_domains = ['sou.zhaopin.com'] def start_requests(self): # 设置请求URL url = 'https://sou.zhaopin.com/?jl=530&kw=Python&kt=3' # 发送请求 yield scrapy.Request(url, callback=self.parse) def parse(self, response): # 获职位列表 job_list = response.xpath('//div[@class="joblist-box__item"]') # 遍历职位列表,获职位信息 for job in job_list: # 获职位名称 job_name = job.xpath('.//div[@class="joblist-box__jobname"]/text()') # 获公司名称 company_name = job.xpath('.//div[@class="joblist-box__companyname"]/text()') # 获工作地点 location = job.xpath('.//div[@class="joblist-box__jobarea"]/text()') # 获薪资范围 salary = job.xpath('.//span[@class="joblist-box__salary"]/text()') # 获职位链接 job_link = job.xpath('.//a[@class="joblist-box__jobname"]/@href') # 输出职位信息 yield { '职位名称': job_name.extract_first().strip(), '公司名称': company_name.extract_first().strip(), '工作地点': location.extract_first().strip(), '薪资范围': salary.extract_first().strip(), '职位链接': job_link.extract_first().strip() } ``` 在`start_requests`方法中,我们设置了请求URL,并使用`scrapy.Request`发送请求。在`parse`方法中,我们使用XPath表达式获职位信息,并使用`yield`输出结果。 4. 运行虫 在命令行中,进入项目根目录,输入以下命令运行虫: ``` scrapy crawl zhaopin_spider -o result.json ``` 其中,`-o result.json`表示将结果保存到名为`result.json`的文件中。 需要注意的是,Scrapy框架会自动处理反虫机制,但是也需要注意一些规则,如请求频率等。另外,在数据时,可以使用Scrapy提供的一些中间件,如随机User-Agent、自动重试等,以提高效率和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值