1. 程式人生 > >用scrapy爬取有用的免費的西刺代理

用scrapy爬取有用的免費的西刺代理

爬蟲為什麼要使用代理伺服器?

可以總結為以下幾點:

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