爬爬看:爬取西刺代理

关键字: 西刺代理 爬虫 CSV文件

GitHub:https://github.com/utopianist/XichiProxies


前言

由于群里一位水友的提问,我打算写这份代码。

西刺网站的代理分为四种:高匿普通(透明)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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值