用scrapy爬取有用的免費的西刺代理
阿新 • • 發佈:2018-12-16
爬蟲為什麼要使用代理伺服器?
可以總結為以下幾點:
1.我們在使用python爬蟲爬取一個網站時,通常會頻繁訪問該網站。網站的反爬蟲技術就會檢某一段時間某個IP的訪問次數,如果
訪問次數過多,它就會禁用你的IP,所以我們可以設定一些代理伺服器來幫助你做工作,每隔一段時間換一個代理,這樣便不會出
現因為頻繁訪問而導致禁止訪問的現象。
2.由於網路環境因素,直爬取速度太慢,但我們訪問代理速度比較快,代理訪問目標網站速度也比較快,所以我們使用代理提高爬
取速度。
3.由於某些地方法律或政治原因,某些網站無法直接訪問,使用代理繞開訪問限制。
閒言少敘,來看scrapy如何爬取能用的西刺代理。
# -*- coding: utf-8 -*- import scrapy import json #高匿代理 class ProxySpider(scrapy.Spider): name = 'proxy' allowed_domains = ['www.xicidaili.com'] start_urls = ['http://www.xicidaili.com/nn/%s' % i for i in range(1,6)] def parse(self, response): #position()>1 獲取tr標籤位置大於1的標籤 for sel in response.css('table#ip_list').xpath('.//tr[position()>1]'): # nth-child(2)獲取第二個子標籤 (注意這裡的順序從1開始) ip = sel.css('td:nth-child(2)::text').extract_first() #ip port = sel.css('td:nth-child(3)::text').extract_first() #埠 scheme = sel.css('td:nth-child(6)::text').extract_first() #型別HTTP,https # 拼接代理url proxy = '%s://%s:%s' % (scheme,ip,port) # 定義json資料 meta 文字 meta = { 'proxy':proxy, 'dont_retry':True, #只下載一次,失敗不重複下載 'download_timeout':10, # 設定等待時間 '_proxy_ip':ip, '_proxy_scheme':scheme } #校驗代理是否可用 通過訪問httpbin.org/ip,進行檢測 url = '%s://httpbin.org/ip' % scheme yield scrapy.Request(url,callback=self.check,meta=meta,dont_filter=True) def check(self,response): proxy_ip = response.meta['_proxy_ip'] proxy_scheme = response.meta['_proxy_scheme'] #json.loads()將json文字返回字典型別 origin原代理 if json.loads(response.text)['origin'] == proxy_ip: yield { 'proxy':response.meta['proxy'], 'scheme':proxy_scheme, }
執行爬蟲時,將爬取到的內容放到json檔案中,留作後用。
scrapy crawl proxy -o proxy_list.json