首页 > 其他分享 >如何利用爬虫与数据分析指导选择首篇小说类型:第三章通过免费代理网站建立ip池

如何利用爬虫与数据分析指导选择首篇小说类型:第三章通过免费代理网站建立ip池

时间:2024-04-02 23:00:43浏览次数:25  
标签:ips url ip 首篇 代理 爬虫 headers soup

如何利用爬虫与数据分析指导选择首篇小说类型:第三章通过免费代理网站建立ip池

第三章通过免费代理网站建立ip池


文章目录


前言

之前一篇文章已讲述如何使用代理ip获取小说数据:第二章 使用代理ip获取小说数据。相信大家对于如何使用代理ip去获取小说网站数据有大致了解,但是仍带来两个问题:
1、如何快速获取免费代理网站建立ip池;
2、如何从ip池中快速找出可使用的ip。
下面作者将详细列出两个问题的解决办法。


一、获取免费ip

作者将演示如何从下面5个网站获取代理ip,建立ip池:
66网:http://www.66ip.cn/
89网:https://www.89ip.cn/
快代理:https://www.kuaidaili.com/free/dps/
开心代理:http://www.kxdaili.com/dailiip.html
云代理:http://www.ip3366.net/free/

1.封装requests请求网址方法

代码如下:

############请求页面信息
def get_url(url='',headers='',proxies=False):
    try:
        if proxies:
            response = requests.get(url, headers=headers, proxies={'http': proxies, 'https': proxies} , timeout=(5,10))
        else:
            response = requests.get(url,headers=headers,timeout=10)
        if response.status_code == 200:
            soup = BeautifulSoup(response.text,'html.parser')
            return soup
        else:
            return False
    except Exception as e:
        print(e)
        return False

2.获取代理ip—开心代理

代码如下:

##########################从开心代理获取免费ip池
def getIpByKxdl(headers):
    try:
        ips = []
        for i in range(1, 3):
            url = r'http://www.kxdaili.com/dailiip/1/' + str(i) + r'.html'
            soup = get_url(url, headers)
            if soup:
                pattern = r"(\d{1,3}\.\d{1,3}.\d{1,3}.\d{1,3})\s*\r?\n\s*(\d{1,5})"
                matches = re.findall(pattern, soup.text)
                for ip, port in matches:
                    ips.append(str(ip) + ':' + str(port))
                print("开心代理:",ips)
        return ips
    except Exception as e:
        print(e)
        return []

3.获取代理ip—66代理

代码如下:

##########################从66代理获取免费ip池
def getIpBy66dl(headers):
    try:
        ips = []
        for i in range(1, 3):
            url = r'http://www.66ip.cn/nmtq.php?getnum=&isp=0&anonymoustype=0&start=&ports=&export=&ipaddress=&area=1&proxytype=2&api=66ip'
            soup = get_url(url, headers)
            if soup:
                pattern = r"(\d{1,3}\.\d{1,3}.\d{1,3}.\d{1,3})\s*\r?:\s*(\d{1,5})"
                matches = re.findall(pattern, str(soup))
                for ip, port in matches:
                    ips.append(str(ip) + ':' + str(port))
                print("66代理:", ips)
        return ips
    except Exception as e:
        print(e)
        return []

4.获取代理ip—89代理

代码如下:

##########################从89代理获取免费ip池
def getIpBy89dl(headers):
    try:
        ips = []
        for i in range(1, 3):
            url = r'https://www.89ip.cn/index_' + str(i) + '.html'
            soup = get_url(url, headers)
            if soup:
                table_ipc = soup.find('table', 'layui-table')
                pattern = r"(\d{1,3}\.\d{1,3}.\d{1,3}.\d{1,3})\s*\r?\n\s*(\d{1,5})"
                matches = re.findall(pattern, table_ipc.text)
                for ip, port in matches:
                    ips.append(str(ip) + ':' + str(port))
                print("89代理:", ips)
        return ips
    except Exception as e:
        print(e)
        return []

5.获取代理ip—快代理

代码如下:

##########################从快代理获取免费ip池
def getIpByKdl(headers):
    try:
        ips = []
        for i in range(1, 2):
            url = r'https://www.kuaidaili.com/free/dps/' + str(i)
            soup = get_url(url, headers)
            if soup:
                pattern = r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b"
                ip = re.findall(pattern, str(soup))
                pattern = r'"port": "(\d+)"'
                port = re.findall(pattern, str(soup))
                for i in range(len(ip)):
                    ips.append(str(ip[i]) + ':' + str(port[i]))
                print("快代理:", ips)
        return ips
    except Exception as e:
        print(e)
        return []

6.获取代理ip—云代理

代码如下:

##########################从云代理获取免费ip池
def getIpByYdl(headers):
    try:
        ips = []
        for i in range(1, 3):
            url = r'http://www.ip3366.net/free/?stype=1&page=' + str(i)
            soup = get_url(url, headers)
            if soup:
                pattern = r"(\d{1,3}\.\d{1,3}.\d{1,3}.\d{1,3})\s*\r?\n\s*(\d{1,5})"
                matches = re.findall(pattern, soup.text)
                for ip, port in matches:
                    ips.append(str(ip) + ':' + str(port))
                print("云代理:", ips)
        return ips
    except Exception as e:
        print(e)
        return []

二、筛选可用ip

代码如下:

###########################测试ip是否有效
def textProxies(headers,proxies):
    text_url = r'http://icanhazip.com/'
    soup = get_url(text_url, headers, proxies)
    if soup:
        qd_url = r'https://www.qidian.com/'
        qd_soup = get_url(qd_url, headers, proxies)
        if qd_soup:
            return proxies
    else:
        return False

三、建立ip池,筛选可用ip

代码如下(cookie记得更换为自己的网页cookie):
在这里插入图片描述

import re
import pandas as pd
import requests
from bs4 import BeautifulSoup

##############cookie记得更换为自己的网页cookie
headers = {
    'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.289 Mobile Safari/537.36',
    'Cookie': 'newstatisticUUID=1687606367_135137479; fu=1132719504; supportwebp=true; supportWebp=true; _ga_D20NXNVDG2=GS1.1.1698680222.2.0.1698680231.0.0.0; _ga_VMQL7235X0=GS1.1.1698680222.2.0.1698680231.0.0.0; _csrfToken=8c77025c-97fa-44ff-',
}
ips = getIpByKxdl(headers)
ips += getIpBy66dl(headers)
ips += getIpBy89dl(headers)
ips += getIpByKdl(headers)
ips += getIpByYdl(headers)
for proxies in ips:
    proxies = textProxies(headers,proxies)

总结

通过自动构建免费代理IP池并快速筛选可用IP,结合之前的两篇文章:第一章 小说数据获取与解析第二章 使用代理ip获取小说数据,我们已经能够基本实现爬取小说网站内强推小说的全部公开数据。然而,在实际操作过程中,我们不可避免地会面临一些代码优化的问题。

首先,当请求失败时,我们需要有一套完善的处理机制,确保爬虫能够稳定、持续地运行。

其次,当前的IP池中没有可用的IP时,我们需要让爬虫能够自动地继续爬取新的IP,并实时更新IP池,直到找到可用的IP为止。

再者,即使在找到可用IP后,我们还需要考虑在执行爬取任务期间IP突然失效的情况。此时,爬虫应该能够自动切换到下一个可用的IP,以保证爬取任务的连续性。

对于上述问题,作者将在后续的文章中详细探讨并给出解决方案。具体来说,我们将讨论:

1、如何有效地爬取强推、三江等小说数据,确保数据的准确性和完整性。
2、如何利用爬取到的小说数据进行深入的数据分析,挖掘其中的价值。
3、针对请求失败的情况,我们将提供一套实用的错误处理策略。
4、当IP池中没有可用IP时,我们将介绍如何实现爬虫的自动更新IP池功能。
5、在执行业务代码期间,当IP失效时,我们将分享如何优雅地切换到下一个可用IP的方法。
6、最后,我们还将探讨如何利用PyQt5开发一款软件,它不仅能够建立和管理IP池,查找可用IP,还能实现小说数据的爬取和数据的可视化展示,帮助他们更高效地爬取和分析小说数据。

标签:ips,url,ip,首篇,代理,爬虫,headers,soup
From: https://blog.csdn.net/yueguangfan/article/details/137250048

相关文章

  • gdscript学习笔记3-标识符
    任何仅限于字母字符(a到z和A到Z),数字(0到9)和_的字符串都可以作为标识符.此外,标识符不能以数字开头.标识符区分大小写(foo和FOO是不同的).extendsNode2Dvarabc="aaaa"varAbc="bbb"var_abc="ccc"varabc222="ddd"#var222abc="eee"......
  • 查看用户所在区域,IP定位离线库助您实现精准销售目标
     IP定位是现如今互联网营销中非常重要的一项技术。通过对用户的IP地址进行定位,可以精准地了解用户所在的地理位置,并根据不同地域的特点进行精准的销售目标定位。而为了实现这一目标,IP定位离线库成为了不可或缺的工具。本文将介绍一款IP定位离线库,即挖数据平台的IP定位离线库,来......
  • 【爬虫】第一章-Web基础知识
    目录HTML标签分类空标签/单标签闭合标签/双标签块级元素内联元素(行内元素)几种主要网页编码Unicode(统一码、万国码、单一码)UTF-8GB2312GBKHTML标签分类空标签/单标签1)<meta/>元信息2)<img/>图片标签3)<br/>换行标签4)<hr/>水平线5)<link/>引入标签6)<base......
  • 洛谷 P1008 [NOIP1998 普及组] 三连击
    这道题我们可以用桶排序来做,代码如下:#include<bits/stdc++.h>//万能头 usingnamespacestd;//好习惯 inta[10];//一个桶数组,来确定是否有重复的 intmain(){   ints1,s2,s3;//定三个函数,用于判断    intsum=0;//用于判断数字是否重复    for(int......
  • gdscript学习笔记2-变量及变量类型
    extendsNode2Dvarmy_nil=nullvarmy_bool=truevarmy_int=1varmy_real=3.1314varmy_string="stringexample"varmy_vector2=Vector2(1,2)#Calledwhenthenodeentersthescenetreeforthefirsttime.func_ready(): print(typeof......
  • Llama-recipes Quick start 的调试
    先给出Llama-recipes项目的链接LLaMa环境配置condacreate-nLLamapython=3.10#建立虚拟环境condaactivateLLama#激活虚拟环境按照LLamarecipy安装包cd你的llamarecipy的存放位置pipinstall--extra-index-urlhttps://download.pytorch.org/whl/test/c......
  • JavaScript库,编写$()和getElementsByClassName()方法
    背景:JavaScript库是一组预先编写好的JavaScript代码集合,旨在简化常见的网页开发任务。这些库通常包含了许多函数和方法,可以帮助开发人员处理各种任务,比如DOM操作、事件处理、动画效果、AJAX请求等等。使用JavaScript库可以节省开发时间,并提供了一种标准化的方法来解决常见的......
  • DML(Data Manipulation Language、数据操作语言),用于添加、删除、更新和查询数据库记
    ****************************************************************************************DML(DataManipulationLanguage、数据操作语言),用于添加、删除、更新和查询数据库记录,并检查数据完整性。主要的语句关键字包括INSERT、DELETE、UPDATE、SELECT等。SELECT......
  • Udemy AWS SAA - Private vs Public IP (IPv4)
    IPv4[0-255].[0-255].[0-255].[0-255]uniqueacrossthewholeweb,canbegeo-locatedeasily**PrivateNetwork:**everyoneinthenetworkcantalktoeachotheruniqueacrossprivatenetworkmachinesconnecttoWWWusingaNAT+internetgateway(aproxy)......
  • IP(Internet Protocol)是一种网络协议,用于在网络中发送和接收数据包
    IP(InternetProtocol)是一种网络协议,用于在网络中发送和接收数据包。它是一个无连接的、不可靠的数据报协议,负责将数据从源主机传输到目标主机。IP协议的主要功能包括寻址、路由和分段。寻址:IP协议为每个连接到网络的设备分配一个唯一的IP地址,这个地址用于在网络中识别设备......