scrapy使用隨機User-Agent

scrapy使用隨機User-Agent

衆所周知,User-Agent值是用來幫助服務器識別用戶使用的操做系統、瀏覽器、瀏覽器版本等等信息的,所以也常被用來檢測爬蟲。python

許多網站會ban掉來自爬蟲的請求,來達到反爬的目的。瀏覽器

正常瀏覽器的User-Agent值爲:服務器

Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0dom

使用requests時的默認User-Agent爲:scrapy

python-requests/2.18.4ide

scrapy的默認值爲:函數

Scrapy/1.5.0 (+https://scrapy.org)網站

服務器能夠輕易識別出該請求是否來自爬蟲。url

所以爲了減少爬蟲被ban的概率,咱們能夠經過設置請求的User-Agent來達到欺騙服務器的目的。spa

在scrapy裏,設置隨機的User-Agent有兩種方式

  1. 經過middlware添加
  2. 在spider的request裏添加

首先介紹第一種,經過middleware添加

  1. 安裝fake-useragent
    pip install fake-useragent 這個包裏內置了許多瀏覽器的User-Agent,這樣就不用咱們自建一個User-Agent池了
  2. 在你的scrapy項目的middlewares.py導入fake-useragent包
    from fake_useragent import UserAgent
    而後將下面的RandomUserAgentMiddlware複製進去
class RandomUserAgentMiddlware(object):
    #隨機更換user-agent
    def __init__(self,crawler):
        super(RandomUserAgentMiddlware,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)
複製代碼
  1. 最後在setting.py的DOWNLOADER_MIDDLEWARES裏將其添加進去,這裏的yourProjectName改成你的項目名稱
DOWNLOADER_MIDDLEWARES = {
    'yourProjectName.middlewares.RandomUserAgentMiddlware': 333,
}

複製代碼

那麼這個便設置好了,以後爬蟲啓動後,每個request請求的User-Agent都會是一個隨機的值。這樣即可以欺騙服務器,這是多個瀏覽器發送過來的請求。達到咱們反反爬的目的。

第二種方法,就是在spider裏面添加。

咱們這裏以百度首頁爲例

  1. 一樣是先導入fake-useragent包,而後在parse方法裏,咱們讓它請求十次。
  2. 添加一個second_parse作爲parse函數的回調函數,處理parse函數裏面請求的響應值 。
  3. second_parse裏添加 print(response.request.headers['User-Agent'])用來觀察咱們設置的User-Agent是否生效。具體代碼以下:
def parse(self, response):
        ua = UserAgent()
        for i in range(10):
            header = {'User-Agent':ua.random}
            yield scrapy.Request(url='https://www.baidu.com',headers=header,callback=self.second_parse,dont_filter=True)
    def second_parse(self,response):
        print(response.request.headers['User-Agent'])
複製代碼

運行此爬蟲後,咱們能夠看到爬蟲的部分輸出以下:

2018-09-18 01:27:22 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.baidu.com> (referer: https://www.icourse163.org/)
2018-09-18 01:27:22 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.baidu.com> (referer: https://www.icourse163.org/)
b'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2226.0 Safari/537.36'
b'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36'
b'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17'
b'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36'
b'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1866.237 Safari/537.36'
b'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36'
複製代碼

所以,咱們的隨機User-Agent是已經設置成功了

結束語

以上介紹的兩種方法均可以用來設置隨機User-Agent,只須要根據咱們要爬的的網站特性,任選一種便好。不過通常禁止了爬蟲User-Agent的頁面,通常也是設置了robots協議禁止爬取的,出於職業道德考慮的話,咱們應當避免爬取此類頁面。

相關文章
相關標籤/搜索