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