一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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

服務器之家 - 腳本之家 - Python - python爬蟲構建代理ip池抓取數據庫的示例代碼

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

2020-09-23 09:29亞洲小番茄 Python

這篇文章主要介紹了python爬蟲構建代理ip池抓取數據庫的示例代碼,幫助大家更好的使用爬蟲,感興趣的朋友可以了解下

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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('超過最大嘗試次數,連接失敗!')
          return -1
        continue
      else:
        break # 如果返回碼是200 ,就跳出while循環,對爬取的頁面進行處理
 
    print(f'正在抓取第{i+1}頁數據,共{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: 傳輸協議類型
  :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池抓取數據庫的示例代碼的詳細內容,更多關于python爬蟲構建代理ip池的資料請關注服務器之家其它相關文章!

原文鏈接:https://www.cnblogs.com/jiguangdongtaiip/p/13596835.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品嫩草影院在线 | 亚洲成人一区 | 唯美 清纯 另类 亚洲制服 | 日本护士xxxx爽爽爽 | bl放荡受np双性 | 免费观看一区二区 | 国产一级特黄aa大片在线 | 亚洲电影成人 成人影院 | 99精品免费在线 | 成人看的羞羞视频免费观看 | 欧美一区二区福利视频 | 国产小情侣自拍 | 日本丰满大乳乳奶 | 视频在线观看入口一二三2021 | 1769国产精品免费视频 | 欧美一级久久久久久久大片 | 放荡警察巨r麻麻出轨小说 范冰冰特黄xx大片 饭冈加奈子在线播放观看 法国老妇性xx在线播放 | 精品国产乱码久久久人妻 | 国产欧美一区二区三区免费 | 欧美高清在线 | 国产永久免费爽视频在线 | 亚洲天堂成人在线观看 | 国产成人精品免费久久久久 | 把内裤拔到一边高h1v1 | 91国内精品线免费播放 | japan孕妇孕交 | 99精品国产高清自在线看超 | 精品国内自产拍在线视频 | 三级网站午夜三级 | 欧美大片一区 | 逼逼狗影院 | 国产精品探花一区在线观看 | 欧美日韩一区二区三区在线播放 | 色哟哟在线播放 | 91大神精品 | 免费超级乱淫视频播放性 | 国色天香视频资源网 | 国产亚洲欧美日韩俺去了 | 日本免费三区 | 32pao强力打造免费高速高 | b片在线观看 |