中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

Python怎么搭建代理IP池獲取IP-創(chuàng)新互聯(lián)

小編給大家分享一下Python怎么搭建代理IP池獲取IP,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

創(chuàng)新互聯(lián)專注于企業(yè)網絡營銷推廣、網站重做改版、百色網站定制設計、自適應品牌網站建設、H5高端網站建設、成都做商城網站、集團公司官網建設、成都外貿網站建設、高端網站制作、響應式網頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為百色等各大城市提供網站開發(fā)制作服務。

構建代理 IP 池的第一步:獲取 IP

使用的庫:requests、pyquery

幾個能提供免費代理的代理服務網站(排名不分先后):

廠商名稱地址
66代理http://www.66ip.cn/
西刺代理https://www.xicidaili.com
全網代理http://www.goubanjia.com
云代理http://www.ip3366.net
IP海http://www.iphai.com
快代理https://www.kuaidaili.com
免費代理IP庫http://ip.jiangxianli.com

代理服務網站 Crawler

代理獲取的相關代碼,把從每個網站提取 IP 的方法都放到一起,然后運行時只要調用相關方法即可

為了實現(xiàn)靈活,將獲取代理的一個個方法統(tǒng)一定義一個規(guī)范,如統(tǒng)一定義以 crawl 開頭,這樣擴展的時候只需要添加 crawl 開頭的方法即可

在這里實現(xiàn)了幾個示例,如抓取代理 66、西刺代理、云代理、快代理 四個免費代理網站,這些方法都定義成生成器,通過 yield 返回。首先將網頁獲取,然后用 PyQuery 解析,解析出 IP 加端口形式的代理再返回

crawler.py

import json
import re
from utils import get_page
from pyquery import PyQuery as pq

# 元類
class ProxyMetaclass(type):
 def __new__(cls, name, bases, attrs):
  count = 0
  attrs['__CrawlFunc__'] = []
  for k, v in attrs.items():
   if 'crawl_' in k:
    attrs['__CrawlFunc__'].append(k)
    count += 1
  attrs['__CrawlFuncCount__'] = count
  return type.__new__(cls, name, bases, attrs)

class Crawler(object, metaclass=ProxyMetaclass):
 def get_proxies(self, callback):
  proxies = []
  for proxy in eval("self.{}()".format(callback)):
   print('成功獲取到代理', proxy)
   proxies.append(proxy)
  return proxies

 def crawl_daili66(self, page_count=4):
  start_url = 'http://www.66ip.cn/{}.html'
  urls = [start_url.format(page) for page in range(1, page_count + 1)]
  for url in urls:
   print('Crawling', url)
   html = get_page(url)
   if html:
    doc = pq(html)
    trs = doc('.containerbox table tr:gt(0)').items()
    for tr in trs:
     ip = tr.find('td:nth-child(1)').text()
     port = tr.find('td:nth-child(2)').text()
     yield ':'.join([ip, port])

 def crawl_xicidaili(self):
  for i in range(1, 3):
   start_url = 'http://www.xicidaili.com/nn/{}'.format(i)
   headers = {
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Host':'www.xicidaili.com',
    'Referer':'http://www.xicidaili.com/nn/3',
    'Upgrade-Insecure-Requests':'1',
   }
   html = get_page(start_url, options=headers)
   if html:
    find_trs = re.compile('<tr class.*?>(.*?)</tr>', re.S)
    trs = find_trs.findall(html)
    for tr in trs:
     find_ip = re.compile('<td>(\d+\.\d+\.\d+\.\d+)</td>') 
     re_ip_address = find_ip.findall(tr)
     find_port = re.compile('<td>(\d+)</td>')
     re_port = find_port.findall(tr)
     for address,port in zip(re_ip_address, re_port):
      address_port = address+':'+port
      yield address_port.replace(' ','')

 def crawl_ip3366(self):
  for i in range(1, 4):
   start_url = 'http://www.ip3366.net/?stype=1&page={}'.format(i)
   html = get_page(start_url)
   if html:
    find_tr = re.compile('<tr>(.*?)</tr>', re.S)
    trs = find_tr.findall(html)
    for s in range(1, len(trs)):
     find_ip = re.compile('<td>(\d+\.\d+\.\d+\.\d+)</td>')
     re_ip_address = find_ip.findall(trs[s])
     find_port = re.compile('<td>(\d+)</td>')
     re_port = find_port.findall(trs[s])
     for address,port in zip(re_ip_address, re_port):
      address_port = address+':'+port
      yield address_port.replace(' ','')

 def crawl_kuaidaili(self):
  for i in range(1, 4):
   start_url = 'http://www.kuaidaili.com/free/inha/{}/'.format(i)
   html = get_page(start_url)
   if html:
    ip_address = re.compile('<td data-title="IP">(.*?)</td>') 
    re_ip_address = ip_address.findall(html)
    port = re.compile('<td data-title="PORT">(.*?)</td>')
    re_port = port.findall(html)
    for address,port in zip(re_ip_address, re_port):
     address_port = address+':'+port
     yield address_port.replace(' ','')

定義了一個 ProxyMetaclass,Crawl 類將它設置為元類,元類中實現(xiàn)了 new() 方法,遍歷 attrs 變量即可獲取類的所有方法信息,判斷方法名前面是否是 crawl,是則將其加入到 CrawlFunc 屬性中

代理網站的添加非常靈活,不僅可以添加免費代理,也可以添加付費代理,一些付費代理的提取方式類似,也通過 Web 的形式獲取再進行解析,解析方式可能更加簡單,如解析純文本或 Json,解析之后以同樣的方式返回,可以自行擴展

utils.py

import requests
from requests.exceptions import ConnectionError

base_headers = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',
 'Accept-Encoding': 'gzip, deflate, sdch',
 'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7'
}

def get_page(url, options={}):

 headers = dict(base_headers, **options)
 print('正在抓取', url)
 try:
  response = requests.get(url, headers=headers)
  print('抓取成功', url, response.status_code)
  if response.status_code == 200:
   return response.text
 except ConnectionError:
  print('抓取失敗', url)
  return None

抓取網頁內容的方法,訪問鏈接成功后返回整個網頁 HTML 內容,便于后續(xù)對網頁具體內容的提取。封裝成一個方法,讓上面的 crawler 在抓取各個網站時調用

進行抓取

getter.py

from crawler import Crawler
from setting import *
import sys

class Getter():
 def __init__(self):
  self.crawler = Crawler()
 
 def run(self):
  print('獲取器開始執(zhí)行')
  for callback_label in range(self.crawler.__CrawlFuncCount__):
   callback = self.crawler.__CrawlFunc__[callback_label]
   # 獲取代理
   all_ip = self.crawler.get_proxies(callback)

if __name__ == '__main__':
 get = Getter()
 get.run()

運行結果:

Python怎么搭建代理IP池獲取IP

網站上的免費 IP 就被成功抓取下來了,至于能不能用,就有待驗證了

整個過程其實就是一個普通的爬蟲,而且沒什么反爬措施,能到用代理 IP 的地步,代碼里面的訪問、抓取部分的細節(jié)應該都看得懂

看完了這篇文章,相信你對“Python怎么搭建代理IP池獲取IP”有了一定的了解,如果想了解更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

本文名稱:Python怎么搭建代理IP池獲取IP-創(chuàng)新互聯(lián)
新聞來源:http://www.rwnh.cn/article22/ccshcc.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供做網站、網站建設、定制網站、網站導航、搜索引擎優(yōu)化App設計

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
韶山市| 乌鲁木齐县| 新安县| 乐陵市| 东乌珠穆沁旗| 多伦县| 门源| 商南县| 株洲县| 托克逊县| 黄梅县| 英超| 虎林市| 海伦市| 高州市| 莎车县| 南靖县| 白银市| 泸西县| 陈巴尔虎旗| 施秉县| 金川县| 乐都县| 苍溪县| 贵定县| 岐山县| 德昌县| 图们市| 台湾省| 宁城县| 道真| 舞钢市| 永修县| 潼南县| 永川市| 石首市| 确山县| 福鼎市| 佳木斯市| 梅河口市| 祁门县|