欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python爬蟲構建代理ip池抓取數(shù)據庫的示例代碼

 更新時間:2020年09月22日 16:23:53   作者:亞洲小番茄  
這篇文章主要介紹了python爬蟲構建代理ip池抓取數(shù)據庫的示例代碼,幫助大家更好的使用爬蟲,感興趣的朋友可以了解下

爬蟲的小伙伴,肯定經常遇到ip被封的情況,而現(xiàn)在網絡上的代理ip免費的已經很難找了,那么現(xiàn)在就用python的requests庫從爬取代理ip,創(chuàng)建一個ip代理池,以備使用。

本代碼包括ip的爬取,檢測是否可用,可用保存,通過函數(shù)get_proxies可以獲得ip,如:{'HTTPS': '106.12.7.54:8118'}

下面放上源代碼,并詳細注釋:

import requests
from lxml import etree
from requests.packages import urllib3
import random, time
 
urllib3.disable_warnings()
 
 
def spider(pages, max_change_porxies_times=300):
  """
  抓取 XiciDaili.com 的 http類型-代理ip-和端口號
 
  將所有抓取的ip存入 raw_ips.csv 待處理, 可用 check_proxies() 檢查爬取到的代理ip是否可用
  -----
  :param pages:要抓取多少頁
  :return:無返回
  """
  s = requests.session()
  s.trust_env = False
  s.verify = False
  urls =com/nn/{}'
  proxies = {}
  try_times = 0
  for i in range(pages):
    url = urls.format(i + 1)
    s.headers = {
      'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
      'Accept-Encoding': 'gzip, deflate, br',
      'Accept-Language': 'zh-CN,zh;q=0.9',
      'Connection': 'keep-alive',
      'Referer': urls.format(i if i > 0 else ''),
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'}
    while True:
      content = s.get(url, headers=s.headers, proxies=proxies)
      time.sleep(random.uniform(1.5, 4)) # 每讀取一次頁面暫停一會,否則會被封
      if content.status_code == 503: # 如果503則ip被封,就更換ip
        proxies = get_proxies()
        try_times += 1
        print(f'第{str(try_times):0>3s}次變更,當前{proxies}')
        if try_times > max_change_porxies_times:
          print('超過最大嘗試次數(shù),連接失敗!')
          return -1
        continue
      else:
        break # 如果返回碼是200 ,就跳出while循環(huán),對爬取的頁面進行處理
 
    print(f'正在抓取第{i+1}頁數(shù)據,共{pages}頁')
    for j in range(2, 102): # 用簡單的xpath提取http,host和port
      tree = etree.HTML(content.text)
      http = tree.xpath(f'//table[@id="ip_list"]/tr[{j}]/td[6]/text()')[0]
      host = tree.xpath(f'//table[@id="ip_list"]/tr[{j}]/td[2]/text()')[0]
      port = tree.xpath(f'//table[@id="ip_list"]/tr[{j}]/td[3]/text()')[0]
      check_proxies(http, host, port) # 檢查提取的代理ip是否可用
 
 
def check_proxies(http, host, port, test_url='http://www.baidu.com'):
  """
  檢測給定的ip信息是否可用
 
  根據http,host,port組成proxies,對test_url進行連接測試,如果通過,則保存在 ips_pool.csv 中
  :param http: 傳輸協(xié)議類型
  :param host: 主機
  :param port: 端口號
  :param test_url: 測試ip
  :return: None
  """
  proxies = {http: host + ':' + port}
  try:
    res = requests.get(test_url, proxies=proxies, timeout=2)
    if res.status_code == 200:
      print(f'{proxies}檢測通過')
      with open('ips_pool.csv', 'a+') as f:
        f.write(','.join([http, host, port]) + '\n')
  except Exception as e: # 檢測不通過,就不保存,別讓報錯打斷程序
    print(e)
 
 
def check_local_ip(fn, test_url):
  """
  檢查存放在本地ip池的代理ip是否可用
 
  通過讀取fn內容,加載每一條ip對test_url進行連接測試,鏈接成功則儲存在 ips_pool.csv 文件中
  :param fn: filename,儲存代理ip的文件名
  :param test_url: 要進行測試的ip
  :return: None
  """
  with open(fn, 'r') as f:
    datas = f.readlines()
    ip_pools = []
  for data in datas:
    # time.sleep(1)
    ip_msg = data.strip().split(',')
    http = ip_msg[0]
    host = ip_msg[1]
    port = ip_msg[2]
    proxies = {http: host + ':' + port}
    try:
      res = requests.get(test_url, proxies=proxies, timeout=2)
      if res.status_code == 200:
        ip_pools.append(data)
        print(f'{proxies}檢測通過')
        with open('ips_pool.csv', 'a+') as f:
          f.write(','.join([http, host, port]) + '\n')
    except Exception as e:
      print(e)
      continue
 
 
def get_proxies(ip_pool_name='ips_pool.csv'):
  """
  從ip池獲得一個隨機的代理ip
  :param ip_pool_name: str,存放ip池的文件名,
  :return: 返回一個proxies字典,形如:{'HTTPS': '106.12.7.54:8118'}
  """
  with open(ip_pool_name, 'r') as f:
    datas = f.readlines()
  ran_num = random.choice(datas)
  ip = ran_num.strip().split(',')
  proxies = {ip[0]: ip[1] + ':' + ip[2]}
  return proxies
 
 
if __name__ == '__main__':
  t1 = time.time()
  spider(pages=3400)
  t2 = time.time()
  print('抓取完畢,時間:', t2 - t1)
 
  # check_local_ip('raw_ips.csv','http://www.baidu.com')

以上就是python爬蟲構建代理ip池抓取數(shù)據庫的示例代碼的詳細內容,更多關于python爬蟲構建代理ip池的資料請關注腳本之家其它相關文章!

相關文章

  • Python實現(xiàn)從url中提取域名的幾種方法

    Python實現(xiàn)從url中提取域名的幾種方法

    這篇文章主要介紹了Python實現(xiàn)從url中提取域名的幾種方法,本文給出了3種方法實現(xiàn)在URL中提取域名的需求,需要的朋友可以參考下
    2014-09-09
  • python中cv2.projectPoints的用法小結

    python中cv2.projectPoints的用法小結

    這篇文章主要介紹了python中cv2.projectPoints的用法,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-12-12
  • Python基于checksum計算文件是否相同的方法

    Python基于checksum計算文件是否相同的方法

    這篇文章主要介紹了Python基于checksum計算文件是否相同的方法,涉及Python針對二進制文件的讀取與判定技巧,需要的朋友可以參考下
    2015-07-07
  • python自動化測試之破解圖文驗證碼

    python自動化測試之破解圖文驗證碼

    這篇文章介紹了python自動化測試之破解圖文驗證碼的解決方案,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • OpenCV2學習筆記之視頻流讀取與處理

    OpenCV2學習筆記之視頻流讀取與處理

    為OpenCV是搞計算機視覺必須要掌握的基礎,這篇文章主要給大家介紹了關于OpenCV2學習筆記之視頻流讀取與處理的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • Python的SQLAlchemy框架使用入門

    Python的SQLAlchemy框架使用入門

    這篇文章主要介紹了Python的SQLAlchemy框架使用入門,SQLAlchemy框架是Python中用來操作數(shù)據庫的ORM框架之一,需要的朋友可以參考下
    2015-04-04
  • 深入理解python?生成器、迭代器、動態(tài)新增屬性及方法

    深入理解python?生成器、迭代器、動態(tài)新增屬性及方法

    這篇文章主要介紹了python?生成器、迭代器、動態(tài)新增屬性及方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • Python線程池thread?pool創(chuàng)建使用及實例代碼分享

    Python線程池thread?pool創(chuàng)建使用及實例代碼分享

    這篇文章主要介紹了Python線程池(thread?pool)創(chuàng)建使用及實例代碼分享,文章圍繞主題展開詳細的內容介紹具有一定的參考價值,需要的小伙伴可以參考一下
    2022-06-06
  • python 爬取吉首大學網站成績單

    python 爬取吉首大學網站成績單

    python簡單爬蟲,爬取吉首大學成績單,學校的成績單居然不支持導出,太坑了,算個績點居然還要手打,我吐了.花2個多小時寫了此python程序來生成可方便求和平均的Excel文件,幫助JSU學子脫離手算煩惱...
    2021-06-06
  • Selenium 安裝和簡單使用的實現(xiàn)

    Selenium 安裝和簡單使用的實現(xiàn)

    這篇文章主要介紹了Selenium 安裝和簡單使用的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12

最新評論