python爬虫——构建代理ip池

原创 2016年08月29日 19:34:08

今年6月份开始的自己的数据分析项目,到现在已经快3个月的时间了。因为中间停歇了两个月的时间,导致现在依然滞留在数据采集那一部分,还好这两天又有了时间来折腾折腾。
我看到有网友说利用python Scrapy框架可以很方便,并且可以伪造ip,以来防止网站的反爬虫,但是我想把python的爬虫工具都过一遍,所以在开始阶段代码有些冗余、粗糙。
还需不断的改进,嗯,github是个很好的工具。

数据采集这一块我暂时瞄准了VOA网站的数据,想利用自然语言分析来看看当下人们关注的趋势、热点,主要的是学习算法、数据挖掘,这是挚爱啊!但是整个流程挺复杂,从制定需求,到Web scraping、Data processing、SQL OR data Analysis、visualization等等这些功能都需要自己一个人来完成。
最难的是算法(机器学习)那一块,还准备剃个光头去学习数学(以防谢顶让自己难过…)

好了,废话说的挺到位,下面开始进入这篇博客的正题:构建自己的代理ip池

先来描述一下思路:
我在网上看过别人构建ip池,说实话,一点也没看懂,他们说话拐弯抹角的,让人找不到直接的答案。索性就再也没有研究过别人的ip池是怎么构建的。
以我自己的理解,就是构建一个存放ip的库,在爬取web内容的时候,用的代理ip是从自己的库里面取的。(希望看到这篇博客的朋友,如果有好的建议,欢迎直接地提出来,期待与您一起讨论。)

首先有个问题:库的ip从哪里来?
http://www.mimiip.com/gngao/
上面的内容可以爬去下来,不用复杂,爬一页就行。页面更新较频繁,可以用shell做定时任务。
代码:

#-*-coding=utf-8-*-

"""
构建代理IP池,存放在mysql中。
"""
from urlparse import urlparse
from bs4 import BeautifulSoup
from requests.exceptions import ProxyError,ConnectionError
import chardet
import requests
import os
import re
import sys
import datetime
import random
import pymysql.cursors

logging_path = os.getenv('LOGGING_PATH')
sys.path.append(logging_path)

from JobLogging import JobLogging

class CreateProxy():
    """实例化日志输出"""
    def __init__(self, log_lev = 'INFO'):
        date_today = datetime.datetime.now().date()
        log_name = os.path.splitext( os.path.split( sys.argv[0])[1])[0]
        log_dir = os.getenv('TASK_LOG_PATH_VOA')
        if  log_dir is None:
            log_dir = '/home/sunnyin/Project/Python/ProjectOfSelf/VOA/ipProxy'
        log_dir += '/' + date_today.strftime("%Y%m%d")
        if not os.path.isdir(log_dir):
            try:
                os.makedirs(log_dir)
            except :
                pass
        mylog = JobLogging(log_name,log_dir)
        self.log = mylog.get_logger()
        self.log.info("Log create success")

    #构建代理IP池
    def ipList(self):
        url_raw = url = "http://www.mimiip.com/gngao/"
        urlList = []

        ipDicts = {}
        session = requests.Session()
            #添加请求头
        headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'}

        req = session.get(url,headers=headers)
        bsObj = BeautifulSoup(req.text,"html.parser")
            # print(bsObj)

        ipField = bsObj.find("table",{"class":"list"}).findAll("tr")
            # print(ipField)
            #找出所有的IP和PORT
        for content in ipField[1:]:
            ip =   content.find("td",text=re.compile("(\d{1,4}.*)")).text.encode('utf-8')
            port = content.find("td",text=re.compile("^(\d{1,4})$")).text.encode('utf-8')

            ipDicts[ip] = port

        return ipDicts

    def insertTable(self,ipDicts):
        connection = pymysql.connect(host='localhost',
                                     user='hive',
                                     password='hive',
                                     db='ScrapyProxy',
                                     cursorclass=pymysql.cursors.DictCursor)
        try:
            with connection.cursor() as cursor:
                for ip in ipDicts:
                    sql = "INSERT INTO IPProxy (ip,port) VALUES (%s,%s)"
                    cursor.execute(sql,(ip,ipDicts[ip]))
                    self.log.info("The "+ip+" added the table IPProxy" )
            connection.commit()
        finally:
            connection.close()
            self.log.info("IP Proxy added ip completed,please check it..")

if __name__ == '__main__':
    x = CreateProxy()
    ips = x.ipList()
    x.insertTable(ips)

知识点:
1 安装mysql,我用的是ubuntu 16版本的,mysql是5.7的。操作和之前的版本不太一样,具体请参考官方文档。
默认root用户是不知道密码的,只能用安装后默认给出的。

cat /etc/mysql/debian.cnf
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host     = localhost
user     = debian-sys-maint
password = 9ADuU74ctDlaWmY7
socket   = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host     = localhost
user     = debian-sys-maint
password = 9ADuU74ctDlaWmY7
socket   = /var/run/mysqld/mysqld.sock

修改密码:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password' PASSWORD EXPIRE INTERVAL 360 DAY;

2 python 连接 mysql并查询mysql中的数据
安装 pymysql : pip install pymysql
测试:下图是在ipython notebook上测试的截图
ipython notebook测试截图
其中有一个函数需要注意,fetchmany(),它可以保存多条查询结果;fetchone()可以保存一条结果,以字典类型存储。
3 数据库连接测试没有问题之后,就可以开始爬取web上的ip了。
效果图:
入库结果
部分日志内容:
日志
有关日志打印的内容,在上一篇文章中有介绍
希望攥写博客的习惯可以坚持,爱分享,爱生活。

版权声明:本文为博主原创文章,未经博主允许不得转载。

python爬虫代理IP池(proxy pool)

1.今天我们来讲下一个非常有用的东西,代理ip池,结果就是一个任务每隔一定时间去到 目标ip代理提供网站(www.bugng.com)去爬取可用数据存到mysql数据库,并且检测数据库已有数据是否可用...
  • LuoZheng4698729
  • LuoZheng4698729
  • 2017年09月14日 10:51
  • 2910

Python爬虫IP代理池的建立和使用

采用IP代理的方法避免短时间大量访问某网站服务器导致IP被封的情况,包括从网上抓取代理IP和端口以及验证其有效性。...
  • sinat_22594309
  • sinat_22594309
  • 2016年12月03日 13:37
  • 8059

Python爬虫系列之----Scrapy使用IP代理池

http://blog.csdn.net/u011781521/article/details/70194744
  • weixin_40770024
  • weixin_40770024
  • 2018年01月30日 11:28
  • 11

Python编程:搭建一个爬虫代理池

分析目标页面 爬取代理ip的地址:http://www.xicidaili.com/ 页面分析: ip在table(id=ip_list)中按照行存放,只要遍历table对象中每个行 tr ...
  • mouday
  • mouday
  • 2018年02月07日 19:02
  • 33

Java网络爬虫(十一)--重构定时爬取以及IP代理池(多线程+Redis+代码优化)

一直觉得自己之前写的使用定时抓取构建IP代理池实在过于简陋,并且有一部分的代码写的并不合理,刚好最近又在学习多线程,就将之前的代码进行了重构,也方便对抓取代理ip有需求的人。之前自己写的那篇文章就不删...
  • championhengyi
  • championhengyi
  • 2017年08月10日 17:16
  • 1246

网络爬虫—动态代理的使用

网络爬虫—动态代理的使用
  • zx1749623383
  • zx1749623383
  • 2017年08月18日 10:22
  • 168

爬虫ip代理服务器的简要思路

爬虫有的时候会遇到被禁ip的情况,这个时候你可以找一下代理网站,抓取一下ip,来进行动态的轮询就没问题了,也可以用别人做好的第三方ip代理平台,比如说crawlera,crawlera是一个利用代理I...
  • djd1234567
  • djd1234567
  • 2016年06月23日 10:45
  • 11620

Java网络爬虫(七)--实现定时爬取与IP代理池

注:对代码及思路进行了改进—Java网络爬虫(十一)–重构定时爬取以及IP代理池(多线程+Redis+代码优化) 定点爬取 当我们需要对金融行业的股票信息进行爬取的时候,由于股票的价格是一直在...
  • championhengyi
  • championhengyi
  • 2017年04月27日 20:22
  • 6564

python 爬虫scrapy框架 自建IP代理池

1、http://www.xicidaili.com/wt 国内免费代理网站2、利用scrapy爬取该网站内的IP地址与端口,写入txt文档3、编写脚本测试txt文档中的ip地址与端口是否可用4、将...
  • learn_is_happy
  • learn_is_happy
  • 2017年12月25日 15:51
  • 85

Python爬虫设置动态代理(在线获取)

问题在写爬虫的早期,一些小的练手项目,并不会涉及到IP的问题,用默认的网络爬一下就OK了。但是一旦面临较大的数据量,较多条目的数据,意味着更多的请求。就有了自己默认IP被封的可能性。一个合格的网站为了...
  • JosephPai
  • JosephPai
  • 2017年12月25日 20:41
  • 461
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python爬虫——构建代理ip池
举报原因:
原因补充:

(最多只允许输入30个字)