Python使用scrapy采集时伪装成HTTP/1.1的方法

  • Post category:Python

在使用Scrapy进行网页爬取时,为了避免被网站封禁,我们需要伪装成浏览器发送HTTP请求。其中一种方法是伪装成HTTP/1.1协议,本文将详细介绍如何实现这种伪装。

伪装成HTTP/1.1协议

在Scrapy中,我们可以通过在settings.py文件中设置USER_AGENTDEFAULT_REQUEST_HEADERS来伪装成HTTP/1.1协议。具体步骤如下:

  1. settings.py文件中设置USER_AGENT,用于指定浏览器的User-Agent信息。例如:

python
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0;64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'

  1. settings.py文件中设置DEFAULT_REQUEST_HEADERS,用于指定HTTP请求头信息。其中,需要设置Accept-Encodinggzip, deflate, br,表示支持压缩格式。例如:

python
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
}

示例1:伪装成HTTP/1.1协议

下面是一个使用Scrapy伪装成HTTP/1.1协议的示例:

import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://www.example.com']

    def parse(self, response):
        # do something
        pass

在以上示例中,我们定义了一个名为MySpider的Spider,并设置了namestart_urls属性。在parse()方法中,我们可以使用response对象来处理网页响应。

为了伪装成HTTP/1.1协议,我们需要在settings.py文件中设置USER_AGENTDEFAULT_REQUEST_HEADERS,如下所示:

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

DEFAULT_REQUEST_HEADERS = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en',
    'Accept-Encoding': 'gzip, deflate, br',
    'Connection': 'keep-alive',
}

在以上示例中,我们设置了USER_AGENT为Chrome浏览器的User-Agent信息,并设置了DEFAULT_REQUEST_HEADERS中的Accept-Encodinggzip, deflate, br,表示支持压缩格式。

示例2:使用middlewares伪装成HTTP/1.1协议

除了在settings.py文件中设置USER_AGENTDEFAULT_REQUEST_HEADERS外,我们还可以使用middlewares来实现伪。具体步骤如下:

  1. 创建一个名为RandomUserAgentMiddleware的middlewares,用于随机选择User-Agent信息。例如:

“`python
import random
from scrapy import signals
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware

class RandomUserAgentMiddleware(UserAgentMiddleware):
def init(self, user_agent_list):
self.user_agent_list = user_agent_list

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

   def process_request(self, request, spider):
       ua = random.choice(self.user_agent_list)
       if ua:
           request.headers.setdefault('User-Agent', ua)

“`

  1. settings.py文件中设置USER_AGENT_LIST,用于指定浏览器的User-Agent信息列表。例如:

python
USER_AGENT_LIST = [
'Mozilla/5.0 (Windows NT 10.0 Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko',
]

  1. settings.py文件中设置DOWNLOADER_MIDDLEWARES,用于指定middlewares的顺序。例如:

python
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.RandomUserAgentMiddleware': 543,
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
}

在以上示例中,我们创建了一个名为RandomUserAgentMiddleware的middlewares,用于随机选择User-Agent信息。在process_request()方法中,我们随机选择一个User-Agent信息,并将其设置到HTTP请求头中。

同时,我们在settings.py文件中设置了USER_AGENT_LISTDOWNLOADER_MIDDLEWARES,用于指浏览器的User-Agent信息列表和middlewares的顺序。

总结

本文介绍了如何使用Scrapy伪装成HTTP/1.1协议,包括在settings.py文件中设置USER_AGENTDEFAULT_REQUEST_HEADERS,以及使用middlewares来实现伪装。我们提供了两个示例,分别演示了如何在Spider中和middlewares中实现伪装。