为什么要随机切换UserAgent?

  • 因为有一部分网站或者说绝大多数网站会对UserAgent进行识别

user-agent的定义

User Agent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。通过这个标 识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计;例如用手机访问谷歌和电脑访问是不一样的,这些是谷歌根据访问者的 UA来判断的。UA可以进行伪装。
浏览器的UA字串的标准格式:浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识版本信息。但各个浏览器有所不同。

在spider中设置UserAgent

在settings 中设置user_agent_list列表

user_agent_list = []#列表中填写常见的user-agent

在spider.py文件中导入列表

import settings import user_agent_list
import random

class ZhihuSpider(scrapy.Spider):
	name = "zhihu"
	allowed_domains = ["www.zhihu.com/"]
	start_urls = ['https://www.zhihu.com/']
	# 由于ZhihuSpider是类只在类实例化的时候调用,当再次调用时,random_agent不会改变,所以在parse函数中再次定义生成新的user-agent,
	random_index = 	random.randint(0,len(user_aent_list-1))#生成一个随机数
	random_agent = user_agent_list(random_index)#随机生成user_agent
	headers = {
		"":
		"":
		"User-Agent":random_agent
	}
	def parse(self, response):
		"""
		提取数据
		"""
		random_index = 	random.randint(0,len(user_aent_list-1))#生成一个随机数
		random_agent = user_agent_list(random_index)#随机生成user_agent
		self.headers["User-Agent"] = random_agent
		yield scrapy.Request(url,headers=self.headers,callback=self.parse)

在settings中设置UserAgent

利用系统本身downloadmiddlewares中的useragent中间件可以直接在settings在可以直接设置一个user-agent:

USER_AGENT = "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1"# user_agent值

利用下载中间件定义自己的middlewares

  • 需要将系统的UserAgent设置为none
    settings.py
DOWNLOADER_MIDDLEWARES = {
	'myproject.middlewares.UserAgentDownloaderMiddleware:543',
	'scrapy.downloadermiddlewares.useragent.Useragent.UserAgentMiddleware':None,
}

由于自己重新定义了useragent,所以要关闭系统的useragent

在middlewares.py中重新定义自己的user-agent函数,

class RandomUserAgentMiddleware(object):
	'''
	随机切换useragent
	'''
	def __init__(self,crawler):
		super(RandomUserAgentMiddleware,self).__init_()
		self.user_agent_list = crawler.settings.get("user_agent_list",[])
	classmethod
	def from_crawler(cls, crawler):
		return cls(crawler)
	def process_request(self,request,spider):
		request.headers.setdefault('User-Agent',random())

settings.py

user_agent_list = []#在这里添加UserAgent,不用写死
  • 因为随时有可能添加新的UserAgent,所以不方便,所以不建议用这一款,

利用fake-useragent的方法

  • 安装
pip install fake-useragent

随意切换浏览器类型

from fake_useragent import UserAgent

class RandomUserAgentMiddleware(object):
	'''
	随机切换useragent
	'''
	def __init__(self,crawler):
		super(RandomUserAgentMiddleware,self).__init_()
		self.ua = UserAgent()
	classmethod
	def from_crawler(cls, crawler):
		return cls(crawler)
	def process_request(self,request,spider):
		request.headers.setdefault('User-Agent',self.ua.random)

确定浏览器类型

  • 为了让中间件更强大能够设定浏览器类型
    settings.py
RANDOM_UA_TYPE = "random"
  • 下载器中间件
from fake_useragent import UserAgent

class RandomUserAgentMiddleware(object):
	'''
	随机切换useragent
	'''
	def __init__(self,crawler):
		super(RandomUserAgentMiddleware,self).__init_()
		self.ua = UserAgent()
		# 为了定义浏览器类型设置
		self.ua_type = crawler.settings.get("RANDOM_UATYPE", "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)
		#random_agent = get_ua()查看产生的UA
		request.headers.setdefault('User-Agent',self.get_ua())

settings.py

DOWNLOADER_MIDDLEWARES = {
	'myproject.middlewares.UserAgentDownloaderMiddleware:543',
	'scrapy.downloadermiddlewares.useragent.Useragent.UserAgentMiddleware':None,
}
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐