国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python scrapy 代理中間件,爬蟲必掌握的內(nèi)容之一

binta / 1559人閱讀

摘要:使用中間件本次的測試站點依舊使用,通過訪問可以獲取當(dāng)前請求的地址。中間件默認(rèn)是開啟的,可以查看其源碼重點為方法。修改代理的方式非常簡單,只需要在請求創(chuàng)建的時候,增加參數(shù)即可。接下來將可用的代理保存到文件中。同步修改文件中的代碼。

本篇博客為大家說明一下 scrapy 中代理相關(guān)知識點。

代理的使用場景

編寫爬蟲代碼的程序員,永遠(yuǎn)繞不開就是使用代理,在編碼過程中,你會碰到如下情形:

  1. 網(wǎng)絡(luò)不好,需要代理;
  2. 目標(biāo)站點國內(nèi)訪問不了,需要代理;
  3. 網(wǎng)站封殺了你的 IP,需要代理。

使用 HttpProxyMiddleware 中間件

本次的測試站點依舊使用 http://httpbin.org/,通過訪問 http://httpbin.org/ip 可以獲取當(dāng)前請求的 IP 地址。
HttpProxyMiddleware 中間件默認(rèn)是開啟的,可以查看其源碼重點為 process_request() 方法。

修改代理的方式非常簡單,只需要在 Requests 請求創(chuàng)建的時候,增加 meta 參數(shù)即可。

import scrapyclass PtSpider(scrapy.Spider):    name = "pt"    allowed_domains = ["httpbin.org"]    start_urls = ["http://httpbin.org/ip"]    def start_requests(self):        yield scrapy.Request(url=self.start_urls[0], meta={"proxy": "http://202.5.116.49:8080"})    def parse(self, response):        print(response.text)

接下來通過獲取一下 https://www.kuaidaili.com/free/ 網(wǎng)站的代理 IP,并測試其代理是否可用。

import scrapyclass PtSpider(scrapy.Spider):    name = "pt"    allowed_domains = ["httpbin.org", "kuaidaili.com"]    start_urls = ["https://www.kuaidaili.com/free/"]    def parse(self, response):        IP = response.xpath("http://td[@data-title="IP"]/text()").getall()        PORT = response.xpath("http://td[@data-title="PORT"]/text()").getall()        url = "http://httpbin.org/ip"        for ip, port in zip(IP, PORT):            proxy = f"http://{ip}:{port}"            meta = {                "proxy": proxy,                "dont_retry": True,                "download_timeout": 10,            }            yield scrapy.Request(url=url, callback=self.check_proxy, meta=meta, dont_filter=True)    def check_proxy(self, response):        print(response.text)

接下來將可用的代理 IP 保存到 JSON 文件中。

import scrapyclass PtSpider(scrapy.Spider):    name = "pt"    allowed_domains = ["httpbin.org", "kuaidaili.com"]    start_urls = ["https://www.kuaidaili.com/free/"]    def parse(self, response):        IP = response.xpath("http://td[@data-title="IP"]/text()").getall()        PORT = response.xpath("http://td[@data-title="PORT"]/text()").getall()        url = "http://httpbin.org/ip"        for ip, port in zip(IP, PORT):            proxy = f"http://{ip}:{port}"            meta = {                "proxy": proxy,                "dont_retry": True,                "download_timeout": 10,                "_proxy": proxy            }            yield scrapy.Request(url=url, callback=self.check_proxy, meta=meta, dont_filter=True)    def check_proxy(self, response):        proxy_ip = response.json()["origin"]        if proxy_ip is not None:            yield {                "proxy": response.meta["_proxy"]            }

同時修改 start_requests 方法,獲取 10 頁代理。

class PtSpider(scrapy.Spider):    name = "pt"    allowed_domains = ["httpbin.org", "kuaidaili.com"]    url_format = "https://www.kuaidaili.com/free/inha/{}/"    def start_requests(self):        for page in range(1, 11):            yield scrapy.Request(url=self.url_format.format(page))

實現(xiàn)一個自定義的代理中間件也比較容易,有兩種辦法,第一種繼承 HttpProxyMiddleware,編寫如下代碼:

from scrapy.downloadermiddlewares.httpproxy import HttpProxyMiddlewarefrom collections import defaultdictimport randomclass RandomProxyMiddleware(HttpProxyMiddleware):    def __init__(self, auth_encoding="latin-1"):        self.auth_encoding = auth_encoding        self.proxies = defaultdict(list)        with open("./proxy.csv") as f:            proxy_list = f.readlines()            for proxy in proxy_list:                scheme = "http"                url = proxy.strip()                self.proxies[scheme].append(self._get_proxy(url, scheme))    def _set_proxy(self, request, scheme):        creds, proxy = random.choice(self.proxies[scheme])        request.meta["proxy"] = proxy        if creds:            request.headers["Proxy-Authorization"] = b"Basic " + creds

代碼核心重寫了 __init__ 構(gòu)造方法,并重寫了 _set_proxy 方法,在其中實現(xiàn)了隨機代理獲取。
同步修改 settings.py 文件中的代碼。

DOWNLOADER_MIDDLEWARES = {   "proxy_text.middlewares.RandomProxyMiddleware": 543,}

創(chuàng)建一個新的代理中間件類

class NRandomProxyMiddleware(object):    def __init__(self, settings):        # 從settings中讀取代理配置 PROXIES        self.proxies = settings.getlist("PROXIES")    def process_request(self, request, spider):        request.meta["proxy"] = random.choice(self.proxies)    @classmethod    def from_crawler(cls, crawler):        if not crawler.settings.getbool("HTTPPROXY_ENABLED"):            raise NotConfigured        return cls(crawler.settings)

可以看到該類從 settings.py 文件中的 PROXIES 讀取配置,所以修改對應(yīng)配置如下所示:

DOWNLOADER_MIDDLEWARES = {    "scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware": None,    "proxy_text.middlewares.NRandomProxyMiddleware": 543,}# 代碼是前文代碼采集的結(jié)果PROXIES = ["http://140.249.48.241:6969",           "http://47.96.16.149:80",           "http://140.249.48.241:6969",           "http://47.100.14.22:9006",           "http://47.100.14.22:9006"]

如果你想測試爬蟲,可編寫一個隨機返回請求代理的函數(shù),將其用到任意爬蟲代碼之上,完成本博客任務(wù)。

收藏時間

本期博客收藏過 400,立刻更新下一篇

今天是持續(xù)寫作的第 261 / 200 天。
可以關(guān)注我,點贊我、評論我、收藏我啦。

更多精彩


???掃碼加入【78技術(shù)人】~ Python 事業(yè)部???,源碼也在這

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/123376.html

相關(guān)文章

  • 網(wǎng)絡(luò)爬蟲介紹

    摘要:什么是爬蟲網(wǎng)絡(luò)爬蟲也叫網(wǎng)絡(luò)蜘蛛,是一種自動化瀏覽網(wǎng)絡(luò)的程序,或者說是一種網(wǎng)絡(luò)機器人。 什么是爬蟲 網(wǎng)絡(luò)爬蟲也叫網(wǎng)絡(luò)蜘蛛,是一種自動化瀏覽網(wǎng)絡(luò)的程序,或者說是一種網(wǎng)絡(luò)機器人。它們被廣泛用于互聯(lián)網(wǎng)搜索引擎或其他類似網(wǎng)站,以獲取或更新這些網(wǎng)站的內(nèi)容和檢索方式。它們可以自動采集所有其能夠訪問到的頁面內(nèi)容,以供搜索引擎做進(jìn)一步處理(分檢整理下載的頁面),而使得用戶能更快的檢索到他們需要的信息。簡...

    sf190404 評論0 收藏0
  • 精通Python網(wǎng)絡(luò)爬蟲(0):網(wǎng)絡(luò)爬蟲學(xué)習(xí)路線

    摘要:以上是如果你想精通網(wǎng)絡(luò)爬蟲的學(xué)習(xí)研究路線,按照這些步驟學(xué)習(xí)下去,可以讓你的爬蟲技術(shù)得到非常大的提升。 作者:韋瑋 轉(zhuǎn)載請注明出處 隨著大數(shù)據(jù)時代的到來,人們對數(shù)據(jù)資源的需求越來越多,而爬蟲是一種很好的自動采集數(shù)據(jù)的手段。 那么,如何才能精通Python網(wǎng)絡(luò)爬蟲呢?學(xué)習(xí)Python網(wǎng)絡(luò)爬蟲的路線應(yīng)該如何進(jìn)行呢?在此為大家具體進(jìn)行介紹。 1、選擇一款合適的編程語言 事實上,Python、P...

    spacewander 評論0 收藏0
  • Python爬蟲Scrapy學(xué)習(xí)(基礎(chǔ)篇)

    摘要:下載器下載器負(fù)責(zé)獲取頁面數(shù)據(jù)并提供給引擎,而后提供給。下載器中間件下載器中間件是在引擎及下載器之間的特定鉤子,處理傳遞給引擎的。一旦頁面下載完畢,下載器生成一個該頁面的,并將其通過下載中間件返回方向發(fā)送給引擎。 作者:xiaoyu微信公眾號:Python數(shù)據(jù)科學(xué)知乎:Python數(shù)據(jù)分析師 在爬蟲的路上,學(xué)習(xí)scrapy是一個必不可少的環(huán)節(jié)。也許有好多朋友此時此刻也正在接觸并學(xué)習(xí)sc...

    pkhope 評論0 收藏0
  • 從零開始Python爬蟲速成指南

    摘要:內(nèi)容如下是我們準(zhǔn)備爬的初始頁這個是解析函數(shù),如果不特別指明的話,抓回來的頁面會由這個函數(shù)進(jìn)行解析。爬取多個頁面的原理相同,注意解析翻頁的地址設(shè)定終止條件指定好對應(yīng)的頁面解析函數(shù)即可。后面的數(shù)字表示的是優(yōu)先級。指明每兩個請求之間的間隔。 序 本文主要內(nèi)容:以最短的時間寫一個最簡單的爬蟲,可以抓取論壇的帖子標(biāo)題和帖子內(nèi)容。 本文受眾:沒寫過爬蟲的萌新。 入門 0.準(zhǔn)備工作 需要準(zhǔn)備的東西:...

    gotham 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<