1. 程式人生 > >爬爬看:爬取西刺代理

爬爬看:爬取西刺代理

關鍵字: 西刺代理 爬蟲 CSV檔案

前言

由於群裡一位水友的提問,我打算寫這份程式碼。

西刺網站的代理分為四種:高匿普通(透明)HTTPSHTTP

對應頁面的 URL 特徵是:nnntwnwt

高匿.png

這裡,我們以 高匿代理 為爬取目標。

目標站點分析

檢視網頁 元素:

爬取目標.png

在標籤 <tr> 中我們發現了代理的 IP 地址和

HTML下載器

def getHTML(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
} try: r = requests.get(url, headers=headers) if r.status_code == 200: return (r.text) except: return ""

HTML解析器

def parseHTML(html, pxyList):
    pattern = re.compile('<tr class=".*?">.*?<td.*?</td>.*?<td>(.*?)</td>.*?<td>(.*?)</td>.*?</tr>'
, re.S) data = re.findall(pattern, html) for item in data: pxyURL = "http://{0}:{1}".format(item[0], item[1]) pxyList.append(pxyURL)

解析 html 我會優先選擇正則表示式,因為正則解析真的很快。解析的代理引數用格式化輸出:

代理列表.png

測試代理

def testPxy(pxyList):
    pxy = [] #用於存放真正可用的代理
    url = 'https://www.baidu.com/'
    headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36' } for item in pxyList: try: print("正在測試",item) proxies = { "https": item, # "https"的代理速度較慢 'http': item } r = requests.get(url, headers=headers, proxies=proxies, timeout=30) if r.status_code == 200: pxy.append(item) except: print( "代理無效", item) with open('xichiProxies.csv', 'a', encoding='utf-8', newline='') as f: writer = csv.writer(f) writer.writerow(pxy)
  • 測試代理可不可用,我採用的方式是呼叫代理去訪問 baidu.com ,如果返回的狀態碼是 200 ,則代理是可用的。
  • 最後呼叫 CSV庫 把檔案儲存為 CSV 檔案。

全碼

import requests
import csv
import re

def getHTML(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
    }
    try:
        r = requests.get(url, headers=headers)
        if r.status_code == 200:
            return (r.text)
    except:
        return ""


def parseHTML(html, pxyList):
    pattern = re.compile('<tr class=".*?">.*?<td.*?</td>.*?<td>(.*?)</td>.*?<td>(.*?)</td>.*?</tr>', re.S)
    data = re.findall(pattern, html)
    for item in data:
        pxyURL = "http://{0}:{1}".format(item[0], item[1])
        pxyList.append(pxyURL)

def testPxy(pxyList):
    pxy = [] #用於存放真正可用的代理
    url = 'https://www.baidu.com/'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
    }
    for item in pxyList:
        try:
            print("正在測試",item)
            proxies = {
                "https": item,  # "https"的代理速度較慢
                'http': item
            }
            r = requests.get(url, headers=headers, proxies=proxies, timeout=30)
            if r.status_code == 200:
                pxy.append(item)
        except:
            print( "代理無效", item)
    with open('xichiProxies.csv', 'a', encoding='utf-8', newline='') as f:
        writer = csv.writer(f)
        writer.writerow(pxy)


def main():
    pxyList = []
    offset = 10  #爬取西刺高匿代理前十頁
    for i in range(offset):
        xcURL = 'http://www.xicidaili.com/nn/' + str(i+1)
        html = getHTML(xcURL)
        parseHTML(html, pxyList)
        print(pxyList)
        testPxy(pxyList)

main()

總結

程式跑起來:

執行程式.png