国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - python爬蟲框架scrapy代理中間件掌握學習教程

python爬蟲框架scrapy代理中間件掌握學習教程

2022-03-01 11:40夢想橡皮擦 Python

這篇文章主要介紹了python爬蟲框架scrapy代理中間件掌握學習教程,為大家說明一下 scrapy 中代理相關知識點,有需要的朋友可以借鑒參考下,希望能夠有所幫助

代理的使用場景

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

網絡不好,需要代理;

目標站點國內訪問不了,需要代理;

網站封殺了你的 IP,需要代理。

 

使用 HttpProxyMiddleware 中間件

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

python爬蟲框架scrapy代理中間件掌握學習教程

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

import scrapy
class 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 scrapy
class 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('//td[@data-title="IP"]/text()').getall()
      PORT = response.xpath('//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 scrapy
class 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('//td[@data-title="IP"]/text()').getall()
      PORT = response.xpath('//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 HttpProxyMiddleware
from collections import defaultdict
import random
class 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']

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

以上就是python爬蟲框架scrapy代理中間件掌握學習教程的詳細內容,更多關于scrapy框架代理中間件學習的資料請關注服務器之家其它相關文章!

原文鏈接:https://blog.csdn.net/hihell/article/details/121012464

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 四季久久免费一区二区三区四区 | 日韩精品一区二区三区在线播放 | 欧美成人久久 | 日韩欧美1区 | 天堂在线免费视频 | 99热最新网站 | 91精品国产综合久久福利软件 | 中文字幕在线免费视频 | 在线亚洲电影 | 欧美伦理一区二区三区 | 天天操天天插 | 亚洲国产精品一区 | 午夜视频福利在线观看 | 男女免费观看在线爽爽爽视频 | a黄视频 | 中文字幕亚洲一区二区三区 | 国产精品久久久久久久久久久久久 | 高清国产一区二区三区四区五区 | 精品久久久久久久人人人人传媒 | 国产欧美精品一区二区三区 | 国产综合精品一区二区三区 | 亚洲欧美国产另类 | 精品久| 欧美另类专区 | 日韩av免费看 | 在线看片你懂得 | 成人午夜在线 | 另类久久 | 免费一区二区三区四区 | 亚洲天堂一区二区 | 这里只有久久精品 | 麻豆av电影在线观看 | a级在线免费观看 | 国产 高清 在线 | 久久av网站 | 91av精品视频 | 国产精品久久久久久亚洲调教 | 精品国产一区二区三区久久久蜜月 | 亚洲国产精品成人女人久久久 | 久久视频在线 | 色九九 |