爬虫实战(二):爬取西刺代理的代理ip

对于刚入门的同学来说,本次实战稍微有点难度,但是简单的爬取图片、文本之类的又没营养,所以这次我选择了爬取西刺代理的ip地址,爬取的代理ip也能在以后的学习中用到

本次实战用的主要知识很多,其中包括:

requests.Session()自动保存cookie

利用抓包工具获取cookie;

BeautifulSoup和xpath匹配html文档中的标签

subprocess测试ip并获取运行时间及匹配的丢包数

代码如下:

"""

案例名称:学习使用ip代理池

需求:从网上找一个代理ip的网站,然后获取网站上的

100个ip,组成代理ip池,然后随机抽取其中一个ip,

并对该ip进行连通性测试,如果该ip可以,我们可以将

该ip作为代理ip来使用

思路:

1,先获取西刺代理网站上的ip(100)

2, 随机抽取其中一个ip,并检测其连通性

3,如果该ip可用,则可以作为代理ip使用

编码:

测试:

"""

import requests

from bs4 import BeautifulSoup

from lxml import etree

import subprocess as sp

import random

import re

"""

函数说明:获取代理ip网站的ip

"""

def get_proxys(page):

#requests的Session()可以自动保存cookie,

#不需要自己维护cookie内容

S = requests.Session()

#目标网址的url

target_url = 'http://www.xicidaili.com/nn/%d' %page

target_headers = {

'Upgrade-Insecure-Requests': '1',

'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',

'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',

'Referer': 'http://www.xicidaili.com/nn/',

'Accept-Encoding': 'gzip, deflate, sdch',

'Accept-Language': 'zh-CN,zh;q=0.8'

}

target_response = S.get(url=target_url,

headers=target_headers)

target_response.encoding = 'utf-8'

target_html = target_response.text

# print(target_html)

#解析数据(ip,port,protocol)

bf1_ip_list = BeautifulSoup(target_html,'lxml')

bf2_ip_list = BeautifulSoup(str(bf1_ip_list.find_all(id='ip_list')),'lxml')

ip_list_info = bf2_ip_list.table.contents

proxys_list = []

for index in range(len(ip_list_info)):

if index % 2 == 1 and index != 1:

dom = etree.HTML(str(ip_list_info[index]))

ip = dom.xpath('//td[2]')

port = dom.xpath('//td[3]')

protocol = dom.xpath('//td[6]')

proxys_list.append(protocol[0].text.lower()

+ "#" + ip[0].text

+ "#" + port[0].text)

return proxys_list

"""

函数说明:检测代理ip的连通性

参数:

ip--代理的ip地址

lose_time--匹配的丢包数

waste_time--匹配平均时间

返回值:

average_time--代理ip的平均耗时

"""

def check_ip(ip, lose_time, waste_time):

cmd = "ping -n 3 -w 3 %s"

#执行命令

p = sp.Popen(cmd %ip, stdin=sp.PIPE,

stdout=sp.PIPE,

stderr=sp.PIPE,

shell=True)

#获取返回结果并解码

out = p.stdout.read().decode('GBK')

lose_time = lose_time.findall(out)

if len(lose_time) == 0:

lose = 3

else:

lose = int(lose_time[0])

#如果丢包数大于2,那么我们返回平均耗时1000

if lose > 2:

#返回false(1000)

return 1000

else:

#平均时间

average = waste_time.findall(out)

if len(average) == 0:

return 1000

else:

average_time = int(average[0])

#返回平均耗时

return average_time

"""

函数说明:初始化正则表达式

返回值:

lose_time--匹配丢包数

waste_time--匹配平均时间

"""

def initpattern():

#匹配丢包数

lose_time = re.compile(u"丢失 = (\d+)",re.IGNORECASE)

#匹配平均时间

waste_time = re.compile(u"平均 = (\d+)ms",re.IGNORECASE)

return lose_time, waste_time

if __name__ == '__main__':

#初始化正则表达式

lose_time, waste_time = initpattern()

#获取ip代理

proxys_list = get_proxys(1)

#如果平均时间超过200ms,则重新选取ip

while True:

#从100个ip中随机选取一个ip作为代理进行网络访问

proxy = random.choice(proxys_list)

split_proxy = proxy.split('#')

#获取ip

ip = split_proxy[1]

#检查ip

average_time = check_ip(ip, lose_time, waste_time)

if average_time > 200:

#去掉不能使用的ip

proxys_list.remove(proxy)

print("ip链接超时,重新获取中...")

else:

break

proxys_list.remove(proxy)

proxys_dict = {split_proxy[0]:split_proxy[1]

+ ":" + split_proxy[2]}

print("使用代理:", proxys_dict)

今天的代码有点难以理解,但是要按照代码步骤及规范理解起来并不难,小伙伴们加油,我自己也加油!

python爬取国内代理ip_python爬虫实战:爬取西刺代理的代理ip(二)相关推荐

  1. Python爬虫实战爬取租房网站2w+数据-链家上海区域信息(超详细)

    Python爬虫实战爬取租房网站-链家上海区域信息(过程超详细) 内容可能有点啰嗦 大佬们请见谅 后面会贴代码 带火们有需求的话就用吧 正好这几天做的实验报告就直接拿过来了,我想后面应该会有人用的到吧 ...

  2. python爬虫实战---爬取大众点评评论

    python爬虫实战-爬取大众点评评论(加密字体) 1.首先打开一个店铺找到评论 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多 ...

  3. python爬虫实战-爬取视频网站下载视频至本地(selenium)

    #python爬虫实战-爬取视频网站下载视频至本地(selenium) import requests from lxml import etree import json from selenium ...

  4. python爬虫实战-爬取微信公众号所有历史文章 - (00) 概述

    http://efonfighting.imwork.net 欢迎关注微信公众号"一番码客"获取免费下载服务与源码,并及时接收最新文章推送. 最近几年随着人工智能和大数据的兴起,p ...

  5. python爬取boss直聘招聘信息_Python爬虫实战-抓取boss直聘招聘信息

    Python Python开发 Python语言 Python爬虫实战-抓取boss直聘招聘信息 实战内容:爬取boss直聘的岗位信息,存储在数据库,最后通过可视化展示出来 PS注意:很多人学Pyth ...

  6. Python爬虫实战---抓取图书馆借阅信息

    Python爬虫实战---抓取图书馆借阅信息 原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约 ...

  7. Scrapy 爬虫实战-爬取字幕库

    Scrapy 爬虫实战-爬取字幕库 1.首先,创建Scrapy框架 创建工程 scrapy startproject zimuku创建爬虫程序 cd zimuku scrapy genspider z ...

  8. node 爬虫 实战 - 爬取拉勾网职位数据

    node 爬虫 实战 - 爬取拉勾网职位数据,主要想把数据用于大数据学习,到时候大数据分析可以自己分析一下职位的情况,和比较一些我现在的职位在深圳乃至全国的开发人员水平. 涉及到的技术栈:node.j ...

  9. 爬虫(三):爬取西刺高匿代理

    抓取西刺高匿代理,并验证IP的可用性,存储到本地文件中. 代码如下 # 导入模块 import requests import chardet import random from scrapy.se ...

  10. 爬取西刺网的免费IP

    在写爬虫时,经常需要切换IP,所以很有必要自已在数据维护库中维护一个IP池,这样,就可以在需用的时候随机切换IP,我的方法是爬取西刺网的免费IP,存入数据库中,然后在scrapy 工程中加入tools ...

最新文章

  1. 负载测试值mpstat的使用技巧
  2. 「GIT SourceTree冲突」解决方案
  3. AC自动机build时的一点小优化
  4. 好看的简图动态背景图床源码 多接口聚合图床
  5. 远程连接 速度慢 显示 正在连接到很久
  6. 坡度土方计算案例_【攻略】如何解锁方格网法土方计算?
  7. kindle刷机ttl_求助大神!现在KPW2只能在TTL下进入uboot
  8. (转)用Javascript获取页面元素的位置
  9. python中mid_Python生成音乐 之 mido库读取midi文件
  10. 深度学习在语音识别中的算法、应用、数据集、行业分析
  11. flutter混编ios打包生成ipa文件
  12. STM32F103+RTT从零开始(二)——RTT系统中点亮LED
  13. LTP(Linux Test Project)学习(五)——LTP代码学习
  14. 顶点计划6-4小组调研报告
  15. Python 爬虫实战(1):分析豆瓣中最新电影的影评
  16. FFmpeg编译出来的库太大?试试这几招
  17. Unity烘焙基础操作
  18. autocad型源代码_VB与AUTOCAD二次开发源代码包
  19. 瑞幸创造VC圈神话,风暴中的OYO回应,企鹅杏仁集团完成2.5亿美元融资...
  20. 如何使TOOLBOX变成中文名称

热门文章

  1. BXP无盘介绍(转)
  2. 再战图形,一图一世界
  3. cmd 查询ip 服务器信息,cmd查看ip(cmd查别人ip)
  4. 数学建模常用的四大模型
  5. 【综合篇】Web前端性能优化原理问题
  6. PHP细说(加强版)
  7. 高中生入门计算机编程,高中生必看:入门学软件编程,看这三点...
  8. drools规则引擎通过数据库存储规则
  9. jedate选择一年范围日期插件
  10. 视频教程-使用 Pandas 与 Matplotlib 分析科比职业生涯数据-Python