100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 每周一练:如何创建自己的Python爬虫代理IP池(IP)

每周一练:如何创建自己的Python爬虫代理IP池(IP)

时间:2019-03-26 02:51:54

相关推荐

每周一练:如何创建自己的Python爬虫代理IP池(IP)

学习Python爬虫的同学,都需要自己建造一个代理IP池(免费的),下面给大家分享代理IP池如何建池。

本项目爬取的是代理商提供的免费IP。

项目爬取代理IP商列表:(自己练手增加代理商)

快代理89免费代理高可用全球免费代理IP库

项目环境

Python 3.9

selenium 4.1.3

chromedriver 100.0.4896.60 (需要适配本电脑chrome版本)下载G

Git仓库

gitee/mz100/ip_pooldinggithub/mz100/ip_pooling

爬取流程:

1、通过命令输入获取爬取网站的选择

main.py

在命令输入选项,获取选择爬取网站,如果全部网站爬取,用多线程的方式进行处理。

异常处理,用于输入有误时,重复执行 run() 方法。

def run():try:print('''请选择获取的ip提供商:1. 快代理2. 89免费代理 3. 高可用全球免费代理ip库4. 全部''')channel = input('请输入选项(数字):')if channel == '1':Kuaidaili().run()elif channel == '2':IpFree().run()elif channel == '3':JiangXianLi().run()elif channel == '4':# 多线程处理channels = [Kuaidaili().run,IpFree().run,JiangXianLi().run]# 创建线程threads = []for i in channels:threads.append(threading.Thread(target=i))# 启动线程for i in threads:i.start()# 等待线程结束for i in threads:i.join()else:raise Exception('输入错误!')except Exception as e:print('输入错误,请重新输入!')run()

2、爬虫主流程

spider_base.py一般爬虫的处理流程分为三个步骤:

爬取数据,整理清洗数据,数据保存展示。

由于我们爬取的IP是公开,很多已经过期不能使用我们需要爬取的是当前可以使用的IP,故此需要进行IP的校验检查,我们就在数据清理后增加 “检查数据”

# 爬取流程def run(self):# 爬取数据html = self.spider()# 整理数据data = self.pipeline(html)# 检查数据data = self.check_useful(data)# 保存数据self.save(data)

3、requests和selenium爬取类定义不同爬取方法

不同的网站,我们需要使用不同的爬取方式,非异步加载的网站,我们采用的是requests包进行爬取即可,异步或者反爬处理过的网站,我们使用selenium爬取。

spider_requests.py

爬取需要注意编码问题,如果乱码,需要增加:req.encoding = req.apparent_encoding

# 爬取数据def spider(self):req = requests.get(url=self.base_url, headers=Proxy().get_header(), timeout=5)# 编码处理req.encoding = req.apparent_encodingreturn req.text

spider_selenium.py

使用selenium,需要注意 chromedriver 和 chrome版本的问题。

注意:chrome_options.add_argument('--headless') 配置后不打开chrome窗口,建议打开进行调试。

# 爬取数据def spider(self):chrome_options = webdriver.ChromeOptions()chrome_options.add_argument('--headless')browser = webdriver.Chrome(options=chrome_options)browser.get(url=self.base_url)# 编码处理data = browser.page_sourcebrowser.quit()return data

4、不同代理商网站的爬取类

channels 目录下定义不同的爬取渠道

每一个爬取渠道的配置不一样的爬取地址和方法,如需要进行不同的数据清理,可以在该类重新定义。

# !/usr/bin/python# -*- coding: utf-8 -*-"""@File : kuaidaili.py@Time : /4/16 18:24@Author : Mz100@Desc : None"""import pandas as pdfrom libs.spider_selenium import Spiderclass Kuaidaili(Spider):def __init__(self):self.base_url = "/free/"self.source = 2# 数据整理def pipeline(self, html):tables = pd.read_html(html)table = tables[0]sources = []isps = []for i in table['位置']:sources.append(self.source)isps.append(i.split()[-1])# 创建 DataFramedf = pd.DataFrame()df['ip'] = table['IP']df['port'] = table['PORT']df['address'] = table['位置']df['isp'] = ispsdf['source'] = sourcesreturn df

5、最后通过Sqlite保存IP数据

# 数据存储def save(self, df):conn = sqlite3.connect(Sqlite().get_db_file())c = conn.cursor()if df.values.all():for i in df.values:if str(i[1]).isdigit():try:sql = "INSERT INTO {5} (ip,port,address,isp,source) VALUES ('{0}', '{1}', '{2}', '{3}','{4}')" \.format(i[0], i[1], i[2], i[3], i[4], Sqlite().get_table())c.execute(sql)mit()print('脚本:' + sql + '插入成功')except Exception as e:print('脚本:' + sql + '插入失败')print(e)conn.close()

至此,我们实现了 代理IP池的建池开发。

喜欢的点个赞 ❤ 吧!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。