一个简单的代理池
使用redis数据库存储,使用时需要在setting文件中修改相应的信息
共包含:
crawler.py: 获取模块,负责从以下两个网站爬取免费代理
http://www.goubanjia.com
http://www.66ip.cn
util.py: 一个工具类,用于爬取免费代理
redisSave.py:存储模块, 将爬取到的代理存入数据库
getter.py: 辅助存储爬到的代理
tester.py: 测试模块,测试代理的可用性
api.py: 接口模块,用于获取可用代理
scheduler.py: 调度模块,用于将以上模块以多线程的形式运行起来
run.py: 程序入口,启动调度器
demo.py: 一个小案例
setting.py: 包含了所有的配置信息
ps:所有文件需建立在同一文件夹下
使用时运行run.py不可关闭,再仿照demo.py进行修改
代码由崔庆才大神的书中而来,稍作了一些整改
才疏学浅,望各位海涵。
crawler.py
import json
from util import get_page
from pyquery import PyQuery as pq
#获取模块
#元类,用于遍历Crawler类中的爬取函数,方便数据存取
class ProxyMetaclass(type):
def __new__(cls, name, bases, attrs):
count = 0
attrs['__CrawlFunc__'] = []
for k, v in attrs.items():
if 'crawl_' in k:
attrs['__CrawlFunc__'].append(k)
count += 1
attrs['__CrawlFuncCount__'] = count
return type.__new__(cls, name, bases, attrs)
class Crawler(object, metaclass=ProxyMetaclass):
def get_proxies(self, callback):
proxies = []
for proxy in eval("self.{}()".format(callback)):
print('成功获取到代理', proxy)
proxies.append(proxy)
return proxies
def crawl_guobanjia(self):
"""
获取Guobanjia
:return: 代理
"""
start_url = 'http://www.goubanjia.com'
html = get_page(start_url)
if html:
doc = pq(html)
tds = doc('td.ip').items()
for td in tds:
td.find('p').remove()
yield td.text().replace('\n','')
def crawl_daili66(self,page_count=4):
"""
获取代理66
:param page_count: 页码
:return: 代理
"""
start_url = 'http://www.66ip.cn/{}.html'
urls = [start_url.format(page) for page in range(1, page_count + 1)]
for url in urls:
print('Crawler', url)
html = get_page(url)
if html:
doc = pq(html)
trs = doc('.containerbox table tr:gt(0)').items()
for tr in trs:
ip = tr.find('td:nth_child(1)').text()
port = tr.find('tr:nth_child(2)').text()
yield ':'.join([ip, port