建立爬虫代理池

在爬取网站信息的过程中,有些网站为了防止爬虫,可能会限制每个ip的访问速度或访问次数。对于限制访问速度的情况,我们可以通过time.sleep进行短暂休眠后再次爬取。对于限制ip访问次数的时候我们需要通过代理ip轮换去访问目标网址。所以建立并维护好一个有效的代理ip池也是爬虫的一个准备工作。

网上提供免费代理ip的网址很多,下面我们以西刺网站为例来建立一个有效的代理ip池。

项目流程:

第一步:构造请求代理ip网站链接

def get_url(url):     # 国内高匿代理的链接
    url_list = []
    for i in range(1,100):
        url_new = url + str(i)
        url_list.append(url_new)
    return url_list

get_url :生成要爬取目标网址的链接

第二步:获取网页内容

def get_content(url):     # 获取网页内容
    user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0'
    headers = {'User-Agent': user_agent}
    req = urllib.request.Request(url=url, headers=headers)
    res = urllib.request.urlopen(req)
    content = res.read()
    return content.decode('utf-8')

get_content:接受的参数是传入的目标网站链接

第三步:提取网页中ip地址和端口号信息

def get_info(content):      # 提取网页信息 / ip 端口
    datas_ip = etree.HTML(content).xpath('//table[contains(@id,"ip_list")]/tr/td[2]/text()')
    datas_port = etree.HTML(content).xpath('//table[contains(@id,"ip_list")]/tr/td[3]/text()')
    with open("data.txt", "w") as fd:
        for i in range(0,len(datas_ip)):
            out = u""
            out += u"" + datas_ip[i]
            out += u":" + datas_port[i]
            fd.write(out + u"\n")     # 所有ip和端口号写入data文件

get_info:接收从get_content函数传来的网页内容,并使用etree解析出ip和端口号,将端口号和ip写入data.

第四步:验证代理ip的有效性

def verif_ip(ip,port):    # 验证ip有效性
    user_agent ='Mozilla/5.0'
    headers = {'User-Agent':user_agent}
    proxy = {'http':'http://%s:%s'%(ip,port)}
    print(proxy)

    proxy_handler = urllib.request.ProxyHandler(proxy)
    opener = urllib.request.build_opener(proxy_handler)
    urllib.request.install_opener(opener)

    test_url = "https://www.baidu.com/"
    req = urllib.request.Request(url=test_url,headers=headers)
    time.sleep(6)
    try:
        res = urllib.request.urlopen(req)
        time.sleep(3)
        content = res.read()
        if content:
            print('that is ok')
            with open("data2.txt", "a") as fd:       # 有效ip保存到data2文件
                fd.write(ip + u":" + port)
                fd.write("\n")
        else:
            print('its not ok')
    except urllib.request.URLError as e:
        print(e.reason)

verif_ip:使用ProxyHandler建立代理,使用代理ip访问某网址,查看是否得到响应。如数据有效,则保存到data2.txt文件

最后:调用各个函数

if __name__ == '__main__':
    url = 'http://www.xicidaili.com/nn/'
    url_list = get_url(url)
    for i in url_list:
        print(i)
        content = get_content(i)
        time.sleep(3)
        get_info(content)

    with open("dali.txt", "r") as fd:
        datas = fd.readlines()
        for data in datas:
            print(data.split(u":")[0])
        # print('%d : %d'%(out[0],out[1]))
            verif_ip(data.split(u":")[0],data.split(u":")[1])

得到爬取结果

-------------------------------------------------------分割线-----------------------------------------------

原文发布于微信公众号 - Python与MySQL(gh_f241b4810c6a)

原文发表时间:2018-03-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据

Python自学笔记——多线程微信文章爬取

# -*- coding: utf-8 -*- """ Created on Tue Dec 26 10:34:09 2017 @author: Andrew ...

22670
来自专栏yukong的小专栏

【ssm个人博客项目实战08】博客的分页显示以及模糊查询,删除。前言1、上篇回顾2、具体编码3、测试与小结

在上一节中我们是完成了博客的回台部分,现在我需要在前台拿到回台传来的数据并且给以显示出来。 不知道大家还记得我们在博客类别管理里面,easyui的datagr...

12540
来自专栏木子昭的博客

Java调用Python爬虫

用java调用python的爬虫程序,是一件很有意思的事情, 但解决方法大多不靠谱,作者花了两天的时间,动手实践,最终完全解决了问题 ? java-p...

1.3K90
来自专栏腾讯移动品质中心TMQ的专栏

Android so的热升级尝试

在Android代码中,加载so库是通过调用System.loadLibrary函数实现的。但和Android的许多特性一样,只提供了加载,而没有卸载和更换等功...

15300
来自专栏IT技术精选文摘

缓存架构之史上讲的最明白的RabbitMQ可靠消息传输实战演练

比如:某个广告主(如:天猫)想在我们的平台(如:今日头条)投放广告,当通过我们的广告系统新建广告的时候,该消息在同步给redis缓存(es)的时候丢失了,而我们...

10840
来自专栏偏前端工程师的驿站

让VIM支持Python2 by update-alternatives

前言  Ubuntu 16+中$ sudo apt install vim所安装的vim只支持Python3,但很多插件如YCM和powerline均需要Pyt...

29380
来自专栏破晓之歌

vue中axios处理http发送请求的示例(Post和get)

axios中文文档:https://github.com/mzabriskie/axios#using-applicationx-www-form-urlenc...

30030
来自专栏vue学习

10、less的引用及公共变量的抽离

less是什么自然不用多言,乃一个css预编译器,可以扩展css语言,添加功能如如允许变量(variables),混合(mixins),函数(functions...

13910
来自专栏施炯的IoT开发专栏

《101 Windows Phone 7 Apps》读书笔记-NOTEPAD

课程内容 Ø 读写文件     Notepad提供了快速、高效的记录手段,它具有以下的特点: Ø 自动保存,使得速记变得快速而简单。 Ø 提供每条笔记的快...

201100
来自专栏spring源码深度学习

重拾python爬虫之urllib3

Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库。许多Python的原生系统已经开始使用urllib3。Urllib3提供了很多pyt...

19220

扫码关注云+社区

领取腾讯云代金券