文档章节

Python 爬取可用代理 IP

大数据之路
 大数据之路
发布于 2012/07/16 14:43
字数 607
阅读 8810
收藏 1

通常情况下爬虫超过一定频率或次数,对应的公网 IP 会被封掉,为了能稳定爬取大量数据,我们一般从淘宝购买大量代理ip,一般 10元 10w IP/天,然而这些 IP 大量都是无效 IP,需要自己不断重试或验证,其实这些 IP 也是卖家从一些代理网站爬下来的。

既然如此,为什么我们不自己动手爬呢?基本思路其实挺简单:

(1)找一个专门的 proxy ip 网站,解析出其中 IP

(2)验证 IP 有效性

(3)存储有效 IP 或者做成服务

一个 demo 如下:

import requests
from bs4 import BeautifulSoup
import re
import socket
import logging

logging.basicConfig(level=logging.DEBUG)


def proxy_spider(page_num):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
    for i in range(page_num):
        url = 'http://www.xicidaili.com/wt/' + str(i + 1)
        r = requests.get(url=url, headers=headers)
        html = r.text
        # print r.status_code
        soup = BeautifulSoup(html, "html.parser")
        datas = soup.find_all(name='tr', attrs={'class': re.compile('|[^odd]')})
        for data in datas:
            soup_proxy = BeautifulSoup(str(data), "html.parser")
            proxy_contents = soup_proxy.find_all(name='td')
            ip_org = str(proxy_contents[1].string)
            ip = ip_org
            port = str(proxy_contents[2].string)
            protocol = str(proxy_contents[5].string)
            wan_proxy_check(ip, port, protocol)
            # print(ip, port, protocol)


def local_proxy_check(ip, port, protocol):
    proxy = {}
    proxy[protocol.lower()] = '%s:%s' % (ip, port)
    # print proxy
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.settimeout(1)
        s.connect((ip, int(port)))
        s.shutdown(2)
        logging.debug("{} {}".format(ip, port))
        return True
    except:
        logging.debug("-------- {} {}".format(ip, port))
        return False


"""
几种在Linux下查询外网IP的办法
https://my.oschina.net/epstar/blog/513186
各大巨头电商提供的IP库API接口-新浪、搜狐、阿里
http://zhaoshijie.iteye.com/blog/2205033
"""


def wan_proxy_check(ip, port, protocol):
    proxy = {}
    proxy[protocol.lower()] = '%s:%s' % (ip, port)
    # proxy =  {protocol:protocol+ "://" +ip + ":" + port}
    # print(proxy)
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
    try:
        result = requests.get("http://pv.sohu.com/cityjson", headers=headers, proxies=proxy, timeout=1).text.strip(
            "\n")
        wan_ip = re.findall(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b", result)[0]
        if wan_ip == ip:
            logging.info("{} {} {}".format(protocol, wan_ip, port))
            logging.debug("========================")
        else:
            logging.debug("//// Porxy bad: {} {}".format(wan_ip, port))
    except Exception as e:
        logging.debug("#### Exception: {}".format(str(e)))


if __name__ == '__main__':
    proxy_spider(1)

Refer:

[1] Python爬虫代理IP池(proxy pool)

https://github.com/jhao104/proxy_pool

[2] Python爬虫代理IP池

http://www.spiderpy.cn/blog/detail/13

[3] python ip proxy tool scrapy crawl. 抓取大量免费代理 ip,提取有效 ip 使用

https://github.com/awolfly9/IPProxyTool

© 著作权归作者所有

大数据之路
粉丝 1613
博文 514
码字总数 334218
作品 0
武汉
架构师
私信 提问
Python实现爬取可用代理IP

  在实现爬虫时,动态设置代理IP可以有效防止反爬虫,但对于普通爬虫初学者需要在代理网站上测试可用代理IP。由于手动测试过程相对比较繁琐,且重复无用过程故编写代码以实现动态抓取可用的...

henleySu
2018/07/23
0
0
实战(一)之使用自带urllib和re正则表达式获取电影详情页链接

一、关于urllib库 网上urllib库的教程文章非常多而且详细具体,我就不过多叙述和重复了,个人更加倾向于将精力放在实战上,而不是反反复复拷贝教程(其实是因为我懒),来几篇干货参考。 py...

歪文
2018/10/29
0
0
python各类爬虫案例,爬到你手软!

小编整理了一些爬虫的案例,代码都整理出来了~ 先来看看有哪些项目呢: python爬虫小工具(文件下载助手) 爬虫实战(笔趣看小说下载) 爬虫实战(VIP视频下载) 爬虫实战(百度文库文章下载...

糖宝lsh
04/14
814
0
PYTHON_百度电影资源搜索工具开发

需求分析 我有一些资源网站,但是每次我需要资源的时候需要打开他们的网页,搜索再筛选我需要的网盘资源,这样的操作非常麻烦 使用python模拟这些搜索操作,然后爬取我需要的百度网盘信息 用...

咖啡绿茶不加糖
08/28
0
0
Python 编写知乎爬虫实践

1、爬虫的基本流程 网络爬虫的基本工作流程如下: 首先选取一部分精心挑选的种子 URL 将种子 URL 加入任务队列 从待抓取 URL 队列中取出待抓取的 URL,解析 DNS,并且得到主机的 ip,并将 UR...

大数据之路
2012/06/16
2.3K
0

没有更多内容

加载失败,请刷新页面

加载更多

《JAVA核心知识》学习笔记 (19. 数据库)

19.1.1. 存储引擎 19.1.1.1. 概念 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、 更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧...

Shingfi
18分钟前
3
0
三分钟手操自己的yum源

本文章原创首发公众号:编程三分钟 上次就想手操yum源了,考虑到有的朋友没接触过,直接写成了yum源的科普,活活憋了我一个星期,现在我们快快开始。 什么情况下我们需要搭建一个仓库呢? 记...

编程三分钟
22分钟前
4
0
一起来学Java8(二)——Lambda表达式

Lambda简介 什么是Lambda表达式,简单的说是一种匿名函数表达方式。因此Lambda表达式本质是个函数,只不过没有函数名称。 Lambda表达式具有以下特点: 匿名,它没有函数名称 本质是个函数,除...

猿敲月下码
24分钟前
4
0
排序算法之希尔排序

1、介绍。 希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D...

daxiongdi
32分钟前
3
0
log4j2入门hello world

1.什么是log4j2 (1)log4j log4j是apache的一个开源项目,表示log for java.是一个日志工具,可以将日志信息输出到文件,控制台等其他地方 ,还可以定义日志的输出格式,另外还有日志级别的区分,可...

Blueeeeeee
34分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部