构建简单的代理池

到现在还不是很理解代理到底是怎么工作的,也不清楚怎么看出来代理是不是在工作,不过本着“想想办法先干他一炮”的精神,先做出来再说,没准以后有用呢。

网上先撸了一遍,找了几个提供免费代理的网站。

(剧透一下,便宜没好货是永恒的真理,免费的就更不用说了,想要稳定好用的还是花点小钱去买代理,成功率要高些)

代理网站1 代理网站2 代理网站3 代理网站4

拿下代理的过程很简单,就不多说了,放点代码吧。

import requests
from pyquery import PyQuery as pq

base_headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36',
    'Accept-Encoding': 'gzip, deflate, sdch',
    'Accept-Language': 'zh-CN,zh;q=0.8'
}

def crawl_66ip():
    start_url = 'http://www.66ip.cn/areaindex_{}/1.html'
    urls = [start_url.format(page) for page in range(1, 35)]
    for url in urls:
        print('Crawling', url)
        response = requests.get(url)
        html  = response.text
        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('td:nth-child(2)').text()
                proxy =  ':'.join([ip, port])

def crawl_proxy360():
    url = 'http://www.proxy360.cn/Region/China'
    response = requests.get(url)
    html  = response.text
    if html:
        doc = pq(html)
        lines = doc('div[name="list_proxy_ip"]').items()
        for line in lines:
            ip = line.find('.tbBottomLine:nth-child(1)').text()
            port = line.find('.tbBottomLine:nth-child(2)').text()
            proxy =  ':'.join([ip, port])

def crawl_goubanjia():
    url = 'http://www.goubanjia.com/free/gngn/index.shtml'
    response = requests.get(url)
    html  = response.text
    if html:
        doc = pq(html)
        tds = doc('td.ip').items()
        for td in tds:
            td.find('p').remove()
            proxy = td.text().replace(' ', '')

def crawl_haoip():
    url = 'http://haoip.cc/tiqu.htm'
    response = requests.get(url)
    html  = response.text
    if html:
        doc = pq(html)
        results = doc('.row .col-xs-12').html().split('<br/>')
        for result in results:
            if result:
                proxy = result.strip()

然后弄个函数把代理弄到mongodb里面去。至于为什么不用其他数据库,因为我还不会啊哈哈哈哈

一样放代码

import pymongo
client = pymongo.MongoClient('localhost',27017)
db =client['proxies']
sheet = db['proxies']

def save_to_mongo(proxy,status):
    data  = {
        'proxy':proxy,
        'status':status,
    }
    sheet.update({'proxy':data['proxy']},data,True)

先放个status字段待会测试用。

存进mongodb

def test_proxy(proxy,url = 'https://www.baidu.com'):
    proxies = {
        'http':'http://'+proxy,
    }
    try:
        res = requests.get(url,proxies=proxies,timeout= 15,headers=base_headers)
        if res.status_code == 200:
            print(proxy,'测试成功')
            sheet.find_one_and_update({'proxy': proxy}, {'$set': {'status': 1}})
        else:
            print(proxy,'测试失败')
            sheet.find_one_and_update({'proxy': proxy}, {'$set': {'status': 0}})
    except Exception:
        print(proxy, '测试失败')
        sheet.find_one_and_update({'proxy': proxy}, {'$set': {'status': 0}})

通过连接百度测试代理是否可用,如果可用status就会更新成1,找有用的代理时用这个过滤下就好了。(好像测试代理可用都是用的百度,不过我想到时爬什么网站就用什么网站测试,所以把百度射到了url默认值里)

后面就是垃圾时间了,代码一放,等吧。

from multiprocessing import Pool
def get_proxies():
    crawl_66ip()
    crawl_proxy360()
    crawl_haoip()
    crawl_goubanjia()

def get_proxies_list():
    proxies_list = []
    for i in sheet.find():
        proxies_list.append(i['proxy'])
    return proxies_list

def main():
    get_proxies()
    proxies_list = get_proxies_list()
    pool = Pool()
    pool.map(test_proxy,proxies_list)

if __name__ == '__main__':
    main()

这样一个简单的代理池就搞定了~

其实没搞定,因为我都不知道能不能用,好不好用,明天用来试试爬来链家的房源信息,觊觎好久了

逻辑很乱,技术很糙,文笔很烂,长得很好o()o

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,612评论 5 471
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,345评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,625评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,022评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,974评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,227评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,688评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,358评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,490评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,402评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,446评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,721评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,802评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,013评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,504评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,080评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,287评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • 晚上翻了很久以前的相册,有回忆,有快乐,有忧伤,还有一些人,索性回不去了。 我还是喜欢以前的自己。虽然不干净,但是...
    铜门深雀阅读 258评论 0 0
  • var gulp = require('gulp'), minify = require('gulp-minify...
    迪兰布鲁斯阅读 238评论 0 0
  • 在我的人生中“文学”是那么的陌生,就像一个陌生人站在你面前不知说什么,可是想溶入一个集体就得去了解文学,认识文学。...
    屋檐下的小燕子阅读 294评论 2 1