关键字: 西刺代理
爬虫
CSV文件
前言
由于群里一位水友的提问,我打算写这份代码。
西刺网站的代理分为四种:高匿 、普通(透明) 、HTTPS 、HTTP 。
对应页面的 URL
特征是:nn 、nt 、wn 、wt 。
这里,我们以 高匿代理 为爬取目标。
目标站点分析
查看网页 元素:
在标签 <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
我会优先选择正则表达式,因为正则解析真的很快。解析的代理参数用格式化输出:
测试代理
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()
总结
程序跑起来: