自动爬取代理IP例子

import time
import json
import datetime
import threading
import requests
from lxml import etree
from queue import Queue

# 爬取免费代理IP 来源xicidaili.com
# 多线程验证代理ip是否可用
class ProxyTest:
    def __init__(self):
        self.test_url = "http://pv.sohu.com/cityjson?ie=utf-8"
        self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36",}
        self.request_queue = Queue()

    def parse_url(self, url, proxies, timeout=3):
        return requests.get(url, headers=self.headers, proxies=proxies, timeout=timeout).content.decode()

    # 请求
    def request(self):
        while True:
            # 获取ip地址
            ip = self.request_queue.get()

            # 发起请求
            try:
                starttime = datetime.datetime.now()
                html_str = self.parse_url(self.test_url, proxies={"http": ip}, timeout=5)
                endtime = datetime.datetime.now()
                use_time = endtime - starttime
            except Exception as e:
                # 请求超时
                print("timeout %s" % ip)
                self.request_queue.task_done()
                continue

            # 检查返回html
            try:
                json_dict = json.loads(html_str[19:-1])
            except:
                print("fail %s, use time %d" % (ip, use_time.seconds))
                self.request_queue.task_done()
                continue

            if ip.startswith("http://"+json_dict["cip"]):
                # 代理可用
                print("success %s, use time %d, %s" % (ip, use_time.seconds, html_str))
                self.request_queue.task_done()
                # 保存到文件
                with open("proxy_ok_ip.json", "a", encoding="utf-8") as f:
                    f.write(ip)
                    f.write("\n")
            else:
                # ip不是高匿代理
                print("%s invalid, use time %d" % (ip, use_time.seconds))
                self.request_queue.task_done()

    def run(self):
        # 读取ip地址文件 并存储到队列中
        with open("proxy.json", "r", encoding="utf-8") as f:
            for line in f:
                self.request_queue.put(line.strip())

        # 遍历,发送请求,获取响应
        for i in range(30):
            # daemon=True 把子线程设置为守护线程,该线程不重要主线程结束,子线程结束
            threading.Thread(target=self.request, daemon=True).start()

        self.request_queue.join() #让主线程等待阻塞,等待队列的任务完成之后再完成

        print("主线程结束")

class Proxy:
    def __init__(self):
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
        }

    def start_urls_superfastip(self):
        return ["http://www.superfastip.com/welcome/freeip/%d" % i for i in range(1,11)]

    def get_content_list_superfastip(self, html_str):
        content_list = []
        html = etree.HTML(html_str)
        tr_list = html.xpath(‘/html/body/div[3]/div/div/div[2]/div/table/tbody/tr‘)
        for tr in tr_list:
            if tr.xpath(‘./td[4]/text()‘)[0].strip() == ‘HTTP‘:
                item = {}
                item["ip"] = tr.xpath(‘./td[1]/text()‘)[0].strip()
                item["port"] = tr.xpath(‘./td[2]/text()‘)[0].strip()
                content_list.append(item)

        return content_list

    def start_urls_xici(self):
        return ["http://www.xicidaili.com/nn/%d" % i for i in range(1,6)]

    def get_content_list_xici(self, html_str):
        content_list = []
        html = etree.HTML(html_str)
        tr_list = html.xpath(‘//table[@id="ip_list"]/tr‘)[1:]
        for tr in tr_list:
            item = {}
            item["ip"] = tr.xpath(‘./td[2]/text()‘)[0].strip()
            item["port"] = tr.xpath(‘./td[3]/text()‘)[0].strip()
            content_list.append(item)
        return content_list

    def start_urls_kuaidaili(self):
        return ["https://www.kuaidaili.com/free/inha/%d/" % i for i in range(1, 11)]

    def get_content_list_kuaidaili(self, html_str):
        content_list = []
        html = etree.HTML(html_str)
        tr_list = html.xpath(‘//div[@id="list"]/table/tbody/tr‘)
        for tr in tr_list:
            item = {}
            item["ip"] = tr.xpath(‘./td[1]/text()‘)[0].strip()
            item["port"] = tr.xpath(‘./td[2]/text()‘)[0].strip()
            content_list.append(item)
        return content_list

    def start_urls_89ip(self):
        return ["http://www.89ip.cn/index_%d.html" % i for i in range(1, 11)]

    def get_content_list_89ip(self, html_str):
        content_list = []
        html = etree.HTML(html_str)
        tr_list = html.xpath(‘//div[@class="layui-form"]/table/tbody/tr‘)
        for tr in tr_list:
            item = {}
            item["ip"] = tr.xpath(‘./td[1]/text()‘)[0].strip()
            item["port"] = tr.xpath(‘./td[2]/text()‘)[0].strip()
            content_list.append(item)
        return content_list

    def parse_url(self, url):
        return requests.get(url, headers=self.headers).content.decode()

    def save_content_list(self, content_list):
        with open("proxy.json", "a", encoding="utf-8") as f:
            for ip in content_list:
                f.write("http://%s:%s" % (ip["ip"], ip["port"]))
                f.write("\n")

    def run(self):
        # 构造请求地址列表
        start_urls_xici = self.start_urls_xici()
        start_urls_89ip = self.start_urls_89ip()
        start_urls_kuaidaili = self.start_urls_kuaidaili()
        start_urls_superfastip = self.start_urls_superfastip()

        all_content_list = []  # 存放所有爬取到的ip

        for url in start_urls_superfastip:
            html_str = self.parse_url(url)  # 获取响应
            content_list = self.get_content_list_superfastip(html_str)  # 处理响应
            all_content_list.extend(content_list)  # 将结果加到列表里
            time.sleep(0.2)

        for url in start_urls_xici:
            html_str = self.parse_url(url)  # 获取响应
            content_list = self.get_content_list_xici(html_str)  # 处理响应
            all_content_list.extend(content_list)  # 将结果加到列表里
            time.sleep(0.2)

        for url in start_urls_kuaidaili:
            html_str = self.parse_url(url)
            content_list = self.get_content_list_kuaidaili(html_str)
            all_content_list.extend(content_list)
            time.sleep(0.2)

        for url in start_urls_89ip:
            html_str = self.parse_url(url)
            content_list = self.get_content_list_89ip(html_str)
            all_content_list.extend(content_list)
            time.sleep(0.2)
        print("抓取完成")
        self.save_content_list(all_content_list)

if __name__ == ‘__main__‘:
    # 抓取数据
    spider = Proxy()
    spider.run()

    # 检测ip是否可用
    proxy = ProxyTest()
    proxy.run()
    print("最后可以用的代理IP在proxy_ok_ip.json")

原文地址:https://www.cnblogs.com/blog-rui/p/11031144.html

时间: 2025-01-17 10:42:48

自动爬取代理IP例子的相关文章

python爬虫:自动投票代码(自动爬取代理IP)

#!/usr/bin/env python # coding=utf-8 # 戴儒锋 # http://www.linuxyw.com import re import random import sys import time import datetime import threading from random import choice import requests import bs4 def get_ip(): """获取代理IP""&quo

python爬虫爬取代理IP

# #author:wuhao # #--*------------*-- #-****#爬取代理IP并保存到Excel----#爬取当日的代理IP并保存到Excel,目标网站xicidaili.com#如果访问频率太快的话,会被网站封掉IP import urllib.request import urllib.parse import re import xlwt import http.cookiejar import datetime from bs4 import BeautifulS

python爬取代理ip

要写爬虫爬取大量的数据,就会面临ip被封的问题,虽然可以通过设置延时的方法来延缓对网站的访问,但是一旦访问次数过多仍然会面临ip被封的风险,这时我们就需要用到动态的ip地址来隐藏真实的ip信息,如果做爬虫项目,建议选取一些平台提供的动态ip服务,引用api即可.目前国内有很多提供动态ip的平台,普遍价格不菲,而对于只想跑个小项目用来学习的话可以参考下本篇文章. 简述 本篇使用简单的爬虫程序来爬取免费ip网站的ip信息并生成json文档,存储可用的ip地址,写其它爬取项目的时候可以从生成的json

python代理池的构建3——爬取代理ip

上篇博客地址:python代理池的构建2——代理ip是否可用的处理和检查 一.基础爬虫模块(Base_spider.py) #-*-coding:utf-8-*- ''' 目标: 实现可以指定不同URL列表,分组的XPATH和详情的XPATH,从不同页面上提取代理的IP,端口号和区域的通用爬虫; 步骤: 1.在base_ spider.py文件中,定义 一个BaseSpider类, 继承object 2.提供三个类成员变量: urls:代理IP网址的URL的列表 group_ xpath:分组X

爬取代理IP

现在爬虫好难做啊,有些网站直接封IP,本人小白一个,还没钱,只能找免费的代理IP,于是去爬了西刺免费代理,结果技术值太低,程序还没调试好, IP又被封了... IP又被封了... IP又被封了... 于是又开始找其他的免费代理,找到了89免费代理,这个网站提供了API接口.在我调试过程中发现,这个API接口好像对爬虫没啥限制,哈哈哈!!! 下面附上代码: 1.这次找了好多User-Agent,以防万一. def __init__(self): self.get_ip_url = "http://

pytohn爬虫成长之路:抓取代理IP并多线程验证

上回说到,突破反爬虫限制的方法之一就是多用几个代理IP,但前提是我们得拥有有效的代理IP,下面我们来介绍抓取代理IP并多线程快速验证其有效性的过程. 一.抓取代理IP 提供免费代理IP的网站还挺多的,我在'西刺代理'上一阵猛抓后自己的IP就被其屏蔽了.只好换'IP巴士'并乖乖的减缓抓取速度了.贴上抓取代码 import urllib.request import urllib import re import time import random #抓取代理IP ip_totle=[] #所有页

python网络爬虫之使用scrapy自动爬取多个网页

前面介绍的scrapy爬虫只能爬取单个网页.如果我们想爬取多个网页.比如网上的小说该如何如何操作呢.比如下面的这样的结构.是小说的第一篇.可以点击返回目录还是下一页 对应的网页代码: 我们再看进入后面章节的网页,可以看到增加了上一页 对应的网页代码: 通过对比上面的网页代码可以看到. 上一页,目录,下一页的网页代码都在<div>下的<a>元素的href里面.不同的是第一章只有2个<a>元素,从二章开始就有3个<a>元素.因此我们可以通过<div>

怎么来爬取代理服务器ip地址?

一年前突然有个灵感,想搞个强大的网盘搜索引擎,但由于大学本科学习软件工程偏嵌入式方向,web方面的能力有点弱,不会jsp,不懂html,好久没有玩过sql,但就是趁着年轻人的这股不妥协的劲儿,硬是把以前没有学习的全部给学了一遍,现在感觉web原来也就那么回事.好了,废话就不说了,看到本文的读者,可以先看看我做的东西:去转盘网 ok搜搜:www.oksousou.com(这个是磁力,顺便拿出来给大伙观赏) 言归正传,由于我要爬取百度网盘,而度娘你懂的的搞爬虫出生的,反爬虫的能力很牛掰.尤其像我用我

Scrapy精华教程(六)——自动爬取网页之II(CrawlSpider)

一.目的. 在教程(二)(http://blog.csdn.net/u012150179/article/details/32911511)中使用基于Spider实现了自己的w3cschool_spider,并在items.py中定义了数据结构, 在pipelines.py中实现获得数据的过滤以及保存. 但是以上述方法只能爬取start_url列表中的网页,而网络爬虫如google等搜索引擎爬虫实现的就是对整个互联网的爬取,所以在本教程中研究使用scrapy自动实现多网页爬取功能. 在教程(五)