怎样使用python爬虫获得免费代理IP

怎样使用python爬虫获得免费代理IP,第1张

概述怎样使用python爬虫获得免费代理IP进行爬取和测试有效性总结爬虫一直是python使用的一个重要部分,而许多网站也为此做了许多反爬措施,其中爬虫访问过于频繁直接封ip地址也作为一种“伤敌一千,自损八百”的方法被许多网站采用,代理ip便可以防止这种情况出现。进行爬取和测

怎样使用Python爬虫获得免费代理IP进行爬取和测试有效性总结
爬虫一直是python使用的一个重要部分,而许多网站也为此做了许多反爬措施,其中爬虫访问过于频繁直接封ip地址也作为一种“伤敌一千,自损八百”的方法被许多网站采用,代理ip便可以防止这种情况出现。

进行爬取和测试有效性

分析完毕开始爬取ip,直接使用第三方的requestsBeautifulSoup4,可以让抓取变得很方便,代码如下:

from iptools import header, dict2proxyfrom bs4 import BeautifulSoup as Soupdef parse_items(items):    # 存放ip信息字典的列表    ips = []    for item in items:        tds = item.find_all('td')        # 从对应位置获取ip,端口,类型        ip, port, _type = tds[1].text, int(tds[2].text), tds[5].text        ips.append({'ip': ip, 'port': port, 'type': _type})    return ipsdef check_ip(ip):    try:        proxy = dict2proxy(ip)        url = 'https://www.ipip.net/'        r = requests.get(url, headers=head, proxIEs=pro,timeout=5)        r.raise_for_status()    except:        return False    else:        return Truedef get_proxIEs(index):    url = 'http://zhimaruanjian.com// % index    r = requests.get(url, headers=header)    r.enCoding = r.apparent_enCoding    r.raise_for_status()    soup = Soup(r.text, 'lxml')    # 第一个是显示最上方的信息的,需要丢掉    items = soup.find_all('tr')[1:]    ips = parse_items(items)    good_proxIEs = []    for ip in ips:        if check(ip):            good_proxIEs.append(ip)    return good_proxIEs

就像在上面写的,有效性我直接使用了ip查询网站,获得的ip基本确保可以直接使用。

写入Json文件

可以将获取的ip存放在Json文件中,Json模块的使用也很简单,直接打开一个文件,使用dump方法写入文件即可

import Jsondef write_to_Json(ips):    with open('proxIEs.Json', 'w', enCoding='utf-8') as f:        Json.dump(ips, f, indent=4)

写入MongoDB

写入数据库后获取和 *** 作会很方便

from pymongo import MongoClIEnt as ClIEntdef write_to_mongo(ips):    clIEnt = ClIEnt(host='localhost', port=27017)    db = clIEnt['proxIEs_db']    coll = db['proxIEs']    for ip in ips:        if coll.find({'ip': ip['ip']}).count() == 0:            coll.insert_one(ip)    clIEnt.close()

写入后使用RoboMongo查看

使用多线程

导入threading包,将Thread封装一下,得到最终的代码

get_proxIEs.pyimport Jsonimport requestsimport timefrom proxIEs_get.iptools import header, dict2proxyfrom bs4 import BeautifulSoup as Soupfrom pymongo import MongoClIEnt as ClIEntimport threadingdef parse_items(items):    # 存放ip信息字典的列表    ips = []    for item in items:        tds = item.find_all('td')        # 从对应位置获取ip,端口,类型        ip, port, _type = tds[1].text, int(tds[2].text), tds[5].text.lower()        ips.append({'ip': ip, 'port': port, 'type': _type})    return ipsdef check_ip(ip, good_proxIEs):    try:        pro = dict2proxy(ip)        # print(pro)        url = 'https://www.ipip.net/'        r = requests.get(url, headers=header, proxIEs=pro, timeout=5)        r.raise_for_status()        print(r.status_code, ip['ip'])    except Exception as e:        # print(e)        pass    else:        good_proxIEs.append(ip)def write_to_Json(ips):    with open('proxIEs.Json', 'w', enCoding='utf-8') as f:        Json.dump(ips, f, indent=4)def write_to_mongo(ips):    '''将数据写入mongoDB'''    clIEnt = ClIEnt(host='localhost', port=27017)    db = clIEnt['proxIEs_db']    coll = db['proxIEs']    # 先检测,再写入,防止重复    for ip in ips:        if coll.find({'ip': ip['ip']}).count() == 0:            coll.insert_one(ip)    clIEnt.close()class GetThread(threading.Thread):    '''对Thread进行封装'''    def __init__(self, args):        threading.Thread.__init__(self, args=args)        self.good_proxIEs = []    def run(self):        url = 'http://zhimaruanjian.com/ % self._args[0]        # 发起网络访问        r = requests.get(url, headers=header)        r.enCoding = r.apparent_enCoding        r.raise_for_status()        soup = Soup(r.text, 'lxml')        # 第一个是显示最上方的信息的,需要丢掉        items = soup.find_all('tr')[1:]        ips = parse_items(items)        threads = []        for ip in ips:            # 开启多线程            t = threading.Thread(target=check_ip, args=[ip, self.good_proxIEs])            t.start()            time.sleep(0.1)            threads.append(t)        [t.join() for t in threads]    def get_result(self):        return self.good_proxIEsif __name__ == '__main__':    # 主函数使用多线程    threads = []    for i in range(1, 30):        t = GetThread(args=[i])        t.start()        time.sleep(10)        threads.append(t)    [t.join() for t in threads]    for t in threads:        proxIEs = t.get_result()        write_to_mongo(proxIEs)iptools.pyheader = {'User-Agent': 'Mozilla/5.0 (windows NT 10.0; Win64; x64) '                        'AppleWebKit/537.36 (KHTML, like Gecko) '                        'Chrome/64.0.3282.186 Safari/537.36'}def dict2proxy(dic):    s = dic['type'] + '://' + dic['ip'] + ':' + str(dic['port'])    return {'http': s, 'https': s}
总结

这个免费代理ip的爬虫没什么太难的地方,就是服务器有点弱,一不小心就503了,需要限制一下访问速度。使用免费的代理会影响使用到的效果,因此可以使用代理商代理ip服务,会更加的稳定安全。

总结

以上是内存溢出为你收集整理的怎样使用python爬虫获得免费代理IP全部内容,希望文章能够帮你解决怎样使用python爬虫获得免费代理IP所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1185596.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存