摘要:使用中間件本次的測試站點依舊使用,通過訪問可以獲取當前請求的地址。中間件默認是開啟的,可以查看其源碼重點為方法。修改代理的方式非常簡單,只需要在請求創建的時候,增加參數即可。接下來將可用的代理保存到文件中。同步修改文件中的代碼。
本篇博客為大家說明一下 scrapy 中代理相關知識點。
編寫爬蟲代碼的程序員,永遠繞不開就是使用代理,在編碼過程中,你會碰到如下情形:
本次的測試站點依舊使用 http://httpbin.org/
,通過訪問 http://httpbin.org/ip 可以獲取當前請求的 IP 地址。
HttpProxyMiddleware 中間件默認是開啟的,可以查看其源碼重點為 process_request()
方法。
修改代理的方式非常簡單,只需要在 Requests
請求創建的時候,增加 meta
參數即可。
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/
網站的代理 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))
實現一個自定義的代理中間件也比較容易,有兩種辦法,第一種繼承 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__
構造方法,并重寫了 _set_proxy
方法,在其中實現了隨機代理獲取。
同步修改 settings.py
文件中的代碼。
DOWNLOADER_MIDDLEWARES = { "proxy_text.middlewares.RandomProxyMiddleware": 543,}
創建一個新的代理中間件類
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
讀取配置,所以修改對應配置如下所示:
DOWNLOADER_MIDDLEWARES = { "scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware": None, "proxy_text.middlewares.NRandomProxyMiddleware": 543,}# 代碼是前文代碼采集的結果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"]
如果你想測試爬蟲,可編寫一個隨機返回請求代理的函數,將其用到任意爬蟲代碼之上,完成本博客任務。
本期博客收藏過 400,立刻更新下一篇
今天是持續寫作的第 261 / 200 天。
可以關注我,點贊我、評論我、收藏我啦。
更多精彩
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/123376.html
摘要:以上是如果你想精通網絡爬蟲的學習研究路線,按照這些步驟學習下去,可以讓你的爬蟲技術得到非常大的提升。 作者:韋瑋 轉載請注明出處 隨著大數據時代的到來,人們對數據資源的需求越來越多,而爬蟲是一種很好的自動采集數據的手段。 那么,如何才能精通Python網絡爬蟲呢?學習Python網絡爬蟲的路線應該如何進行呢?在此為大家具體進行介紹。 1、選擇一款合適的編程語言 事實上,Python、P...
摘要:下載器下載器負責獲取頁面數據并提供給引擎,而后提供給。下載器中間件下載器中間件是在引擎及下載器之間的特定鉤子,處理傳遞給引擎的。一旦頁面下載完畢,下載器生成一個該頁面的,并將其通過下載中間件返回方向發送給引擎。 作者:xiaoyu微信公眾號:Python數據科學知乎:Python數據分析師 在爬蟲的路上,學習scrapy是一個必不可少的環節。也許有好多朋友此時此刻也正在接觸并學習sc...
摘要:內容如下是我們準備爬的初始頁這個是解析函數,如果不特別指明的話,抓回來的頁面會由這個函數進行解析。爬取多個頁面的原理相同,注意解析翻頁的地址設定終止條件指定好對應的頁面解析函數即可。后面的數字表示的是優先級。指明每兩個請求之間的間隔。 序 本文主要內容:以最短的時間寫一個最簡單的爬蟲,可以抓取論壇的帖子標題和帖子內容。 本文受眾:沒寫過爬蟲的萌新。 入門 0.準備工作 需要準備的東西:...
閱讀 2265·2023-04-25 23:15
閱讀 1913·2021-11-22 09:34
閱讀 1546·2021-11-15 11:39
閱讀 954·2021-11-15 11:37
閱讀 2151·2021-10-14 09:43
閱讀 3492·2021-09-27 13:59
閱讀 1505·2019-08-30 15:43
閱讀 3453·2019-08-30 15:43