吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3407|回复: 14
收起左侧

[Python 转载] 自建爬虫ip池

[复制链接]
hxl123 发表于 2020-8-22 14:50
本帖最后由 苏紫方璇 于 2020-8-22 23:36 编辑

python自建简单ip代{过}{滤}理池,多线程检验,可在爬虫中调用防止封ip


import threading
from queue import Queue
from lxml import etree
import requests
import parsel
import time
import random
import re
import csv
from urllib import request
import threading
def check_ip(proxy,url):
    """检测ip的方法"""
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}

    try:
        response = requests.get(url, headers=headers, proxies=proxy, timeout=5)  # 超时报错
        if response.status_code == 200:
            can_use.append(proxy)
    except Exception as error:
        print(error)

# 1、确定爬取的url路径,headers参数

def page(i):
    base_url = 'https://www.kuaidaili.com/ops/proxylist/%d/'%i
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}

    # 2、发送请求 -- requests 模拟浏览器发送请求,获取响应数据
    response = requests.get(base_url, headers=headers)
    data = response.text
    # print(data)

    # 3、解析数据 -- parsel  转化为Selector对象,Selector对象具有xpath的方法,能够对转化的数据进行处理
    # 3、1 转换python可交互的数据类型
    html_data = parsel.Selector(data)
    # 3、2 解析数据
    parse_list = html_data.xpath('//*[@id="freelist"]/table/tbody/tr') # 返回Selector对象
    # print(parse_list)

    # 免费 IP  {"协议":"IP:port"}
    # 循环遍历,二次提取

    for tr in parse_list:
        proxies_dict = {}
      #  http_type = tr.xpath('./td[4]/text()').extract_first()
        http_type='http'
        ip_num = tr.xpath('./td[1]/text()').extract_first()
        port_num = tr.xpath('./td[2]/text()').extract_first()
        # print(http_type, ip_num, port_num)

        # 构建代{过}{滤}理ip字典
        proxies_dict[http_type] = "http://"+ip_num + ':' + port_num
        proxies_dict['https'] = "https://"+ip_num + ':' + port_num
        # print(proxies_dict)
        proxies_list.append(proxies_dict)

if __name__=='__main__':
    start=time.time()
    proxies_list = []
    threads=[]
    can_use = []
    c=input("please input your want to find how much pages")
    for i in range(1,int(c)+1):
        t=threading.Thread(target=page,args=(i,))
        t.start()
        threads.append(t)
    for thread in threads:
        thread.join()

    print(proxies_list)
    print("获取到的代{过}{滤}理ip数量:", len(proxies_list), '个')
    url="https://music.163.com/"
    #url ='http://httpbin.org/get'
    # 检测代{过}{滤}理ip可用性
    threads=[]
    for i in proxies_list:
        t=threading.Thread(target=check_ip,args=(i,url))
        t.start()
        threads.append(t)
    for thread in threads:
        thread.join()

    print("能用的代{过}{滤}理:", can_use)
    print("能用的代{过}{滤}理数量:", len(can_use))
    proxy = random.choice(can_use)
    print(proxy)
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}

    end=time.time()
    print('cost time',end-start)   
   # response = requests.get(url, headers=headers, proxies=random.choice(can_use))

   # print(response.text)

    '''with open ('ip.txt','w',encoding='utf-8')as f:
        for i,a in can_use:

            f.write(i)
            f.write(a)
            f.write('\n')'''




额,就是这样了,想要保存就把注释注释掉就好,爬虫小白,一起学习

免费评分

参与人数 1吾爱币 +5 热心值 +1 收起 理由
苏紫方璇 + 5 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| hxl123 发表于 2020-8-23 04:06
bookaccount 发表于 2020-8-23 03:38
根据response.status_code == 200来判断代{过}{滤}理可用不十分可靠,最好是检测是否有某个字符。比如就mus ...

谢谢,学到了,补充一下,大家可以把url换成自己想要爬的网址,这样出来的ip会更好,然后再去爬虫进行调用
头像被屏蔽
Menguy 发表于 2020-8-22 22:39
 楼主| hxl123 发表于 2020-8-22 22:34
本帖最后由 hxl123 于 2020-8-22 22:39 编辑
Menguy 发表于 2020-8-22 19:08
恕我看不懂大神的代码,能不能编排好再发贴

不不不我很菜的,第一次用这个,完整代码
import threading
from queue import Queue
from lxml import etree
import requests
import parsel
import time
import random
import re
import csv
from urllib import request
import threading
def check_ip(proxy,url):
    """检测ip的方法"""
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}

   
   
    try:
        response = requests.get(url, headers=headers, proxies=proxy, timeout=5)  # 超时报错
        if response.status_code == 200:
            can_use.append(proxy)
    except Exception as error:
        print(error)
   


# 1、确定爬取的url路径,headers参数

def page(i):
    base_url = 'https://www.kuaidaili.com/ops/proxylist/%d/'%i
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}

    # 2、发送请求 -- requests 模拟浏览器发送请求,获取响应数据
    response = requests.get(base_url, headers=headers)
    data = response.text
    # print(data)

    # 3、解析数据 -- parsel  转化为Selector对象,Selector对象具有xpath的方法,能够对转化的数据进行处理
    # 3、1 转换python可交互的数据类型
    html_data = parsel.Selector(data)
    # 3、2 解析数据
    parse_list = html_data.xpath('//*[@id="freelist"]/table/tbody/tr') # 返回Selector对象
    # print(parse_list)

    # 免费 IP  {"协议":"IP:port"}
    # 循环遍历,二次提取
   
    for tr in parse_list:
        proxies_dict = {}
      #  http_type = tr.xpath('./td[4]/text()').extract_first()
        http_type='http'
        ip_num = tr.xpath('./td[1]/text()').extract_first()
        port_num = tr.xpath('./td[2]/text()').extract_first()
        # print(http_type, ip_num, port_num)

        # 构建代{过}{滤}理ip字典
        proxies_dict[http_type] = "http://"+ip_num + ':' + port_num
        proxies_dict['https'] = "https://"+ip_num + ':' + port_num
        # print(proxies_dict)
        proxies_list.append(proxies_dict)
        
if __name__=='__main__':
    start=time.time()
    proxies_list = []
    threads=[]
    can_use = []
    c=input("please input your want to find how much pages")
    for i in range(1,int(c)+1):
        t=threading.Thread(target=page,args=(i,))
        t.start()
        threads.append(t)
    for thread in threads:
        thread.join()
        
    print(proxies_list)
    print("获取到的代{过}{滤}理ip数量:", len(proxies_list), '个')
    url="https://music.163.com/"
    #url ='http://httpbin.org/get'
    # 检测代{过}{滤}理ip可用性
    threads=[]
    for i in proxies_list:
        t=threading.Thread(target=check_ip,args=(i,url))
        t.start()
        threads.append(t)
    for thread in threads:
        thread.join()
        

    print("能用的代{过}{滤}理:", can_use)
    print("能用的代{过}{滤}理数量:", len(can_use))
    proxy = random.choice(can_use)
    print(proxy)
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}


    end=time.time()
    print('cost time',end-start)   
   # response = requests.get(url, headers=headers, proxies=random.choice(can_use))
   
   # print(response.text)
  
    '''with open ('ip.txt','w',encoding='utf-8')as f:
        for i,a in can_use:
        
            f.write(i)
            f.write(a)
            f.write('\n')'''
   

'''proxy_support=urllib.request.ProxyHandler(proxy)

opener=urllib.request.build_opener(proxy_support)
opener.addheaders=[{"User-Agent"," Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}]
urllib.request.install_opener(opener)
response=urllib.request.urlopen(url)
html=response.read().decode("utf-8")
print(html)

'''


效果图

效果图
头像被屏蔽
Menguy 发表于 2020-8-22 19:08
提示: 作者被禁止或删除 内容自动屏蔽
 楼主| hxl123 发表于 2020-8-22 22:43
头像被屏蔽
Menguy 发表于 2020-8-22 22:45
提示: 作者被禁止或删除 内容自动屏蔽
 楼主| hxl123 发表于 2020-8-22 22:48
Menguy 发表于 2020-8-22 22:45
你把你的贴子排好版,不缺回复和点赞,就是应为你的排版让人看不懂,才导致这些问题

谢谢,知道了,下次注意

点评

帮您编辑了一下,现在应该好看多了  详情 回复 发表于 2020-8-22 23:37
苏紫方璇 发表于 2020-8-22 23:37
hxl123 发表于 2020-8-22 22:48
谢谢,知道了,下次注意

帮您编辑了一下,现在应该好看多了
 楼主| hxl123 发表于 2020-8-23 02:54
苏紫方璇 发表于 2020-8-22 23:37
帮您编辑了一下,现在应该好看多了

感谢,辛苦了
bookaccount 发表于 2020-8-23 03:38

mu

本帖最后由 bookaccount 于 2020-8-23 03:40 编辑

根据response.status_code == 200来判断代{过}{滤}理可用不十分可靠,最好是检测是否有某个字符。比如就music.163.com来说,看response里是否包含“网易云音乐”什么的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 01:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表