1. 程式人生 > >Python 爬蟲 關於 scrapy 模組的請求頭

Python 爬蟲 關於 scrapy 模組的請求頭

內容簡介:

使用scrapy寫爬蟲的時候,會莫名其妙的被目標網站拒絕,很大部分是瀏覽器請求頭的原因。 現在一起來看看scrapy的請求頭,並探究設定方式

工具準備

預設請求頭

命令列執行,新建爬蟲

scrapy startproject myspider
cd myspider
scrapy genspider scrapy_spider httpbin.org

改寫生成的scrapy_spider.py檔案

import scrapy

class ScrapySpider(scrapy.Spider):
    name = "scrapy_spider"
    allowed_domains =
["httpbin.org"] start_urls = ( # 請求的連結 "https://httpbin.org/get?show_env=1", ) def parse(self, response): # 打印出相應結果 print response.text if __name__ == '__main__': from scrapy import cmdline cmdline.execute("scrapy crawl scrapy_spider".split())

如果是你正好使用mac本,正好使用pycharm可以按快捷鍵啟動爬蟲 shift + control + r 當然,如果是windows那就右鍵啟動吧

將返回的文字複製到 https://www.json.cn/ 格式化成便於檢視的json格式,下面操作亦然,不再贅述。

{
    "args":{
        "show_env":"1"
    },
    "headers":{
        "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Accept-Encoding":"gzip,deflate",
        "Accept-Language":"en",
        "Connect-Time":"1",
        "Connection"
:"close", "Host":"httpbin.org", "Total-Route-Time":"0", "User-Agent":"Scrapy/1.1.2 (+http://scrapy.org)", "Via":"1.1 vegur", "X-Forwarded-For":"39.155.188.22", "X-Forwarded-Port":"443", "X-Forwarded-Proto":"https", "X-Request-Id":"9dcf91a6-0bed-4d9e-b2bd-b7c88b832d81", "X-Request-Start":"1529654403617" }, "origin":"39.155.188.22", "url":"https://httpbin.org/get?show_env=1" }

看到了吧,預設的請求頭是

"User-Agent":"Scrapy/1.1.2 (+http://scrapy.org)"

修改請求頭

方式一:全域性設定

此方式設定後,覆蓋掉scrapy預設的請求頭,全域性生效,即所有爬蟲都可以享受 settings.py檔案中找到如下程式碼

# Crawl responsibly by identifying yourself (and your website) on the user-agent
# USER_AGENT = 'myspider (+http://www.yourdomain.com)'

解除註釋,修改為自己的請求頭

# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"

執行爬蟲,驗證效果

"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",

方式二:爬蟲設定 優先順序較高 此方式設定後,單個爬蟲生效,此爬蟲的所有連線都享受

class ScrapySpider(scrapy.Spider):
    name = "scrapy_spider"
    allowed_domains = ["httpbin.org"]
    # 新新增的程式碼
    custom_settings = {
        "USER_AGENT": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",
    }
    # -----------
    start_urls = (
        "https://httpbin.org/get?show_env=1",
    )

再次訪問,發現我們的請求頭已經成功更換

"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",

方式三:連結設定

此方法對單個連結生效, 只是此次請求的這個連結享受 在Request方法中設定headers引數

import scrapy

# 請求頭
USER_AGENT = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"

class ScrapySpider(scrapy.Spider):
    name = "scrapy_spider"
    allowed_domains = ["httpbin.org"]

    start_urls = (
        "https://httpbin.org/get?show_env=1",
    )
    # 新加的程式碼
    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, headers={"User-Agent": USER_AGENT})
    # ------------

    def parse(self, response):
        print response.text
"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",

方法四:中介軟體設定

此方法可以從整個專案中去修改請求頭的設定規則,變化多端,不同的寫法,可以配置出不同的設定方式,下面是一個比較簡單的示例

我們參考scrapy預設處理請求頭的中介軟體

	from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware

編寫中介軟體

# middlewares.py

class RandomUserAgentMiddleware(object):
    def process_request(self, request, spider):
        request.headers['User-Agent']= ""  # 絕對設定,其他設定都不生效

我們可以從下面找到預設設定

from scrapy.settings import default_settings

找到專案中對請求頭起作用的中介軟體

'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 400,

settings.py 或者custom_settings替換原有的中介軟體

"DOWNLOADER_MIDDLEWARES": {
        'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,
        "myspider.middlewares.RandomUserAgentMiddleware": 400,
    }

這樣可以從全域性,或者區域性替換掉請求頭規則

作用優先順序

如果作如下設定

# settings.py

USER_AGENT = "settings"
# scrapy_spider.py
custom_settings = {
        "USER_AGENT": "custom_settings",
    }
headers={"User-Agent": "header"}

執行效果為:

"User-Agent":"header"

註釋掉headers

"User-Agent":"custom_settings"

註釋掉custom_settings

"User-Agent":"settings"

註釋掉settings

"User-Agent":"Scrapy/1.1.2 (+http://scrapy.org)"

可見優先順序為:

    headers > custom_settings > settings.py > Scrapy預設

注意

注意User-Agent引數的寫法

headers={"User-Agent": USER_AGENT})

如果寫錯了,很可能發生奇怪的事情

headers={"User_Agent": USER_AGENT}

請求頭中多了Scrapy…

"User-Agent":"Scrapy/1.1.2 (+http://scrapy.org),Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",

其實,很好區分: User-Agent: 瀏覽器請求頭引數,html程式碼中經常用- USER_AGENT: python變數

建議: 每次寫瀏覽器引數,如果怕寫錯就開啟自己的瀏覽器,隨便測試一個頁面,從裡邊複製

總結:

設定方式 作用效果
Scrapy預設 所用爬蟲所有請求
所用爬蟲所有請求
custom_settings = {“USER_AGENT”: “”,} 單個爬蟲所有請求
headers={“User-Agent”: “”} 單個請求
中介軟體方式downloadermiddleware 視編寫規則而定

表格從上至下,優先順序逐漸增加,中介軟體除外,一般掌握三種方式就夠用了:

settings.py custom_settings headers