首页 > 系统相关 >Python使用多进程及代理ip爬取小说

Python使用多进程及代理ip爬取小说

时间:2023-11-29 15:32:28浏览次数:46  
标签:novel get Python ip 爬取 proxy IP 小说

前言

在爬虫的过程中,为了提高爬取速度,我们可以采用多进程、多线程、协程等方式。本文将介绍Python使用多进程进行爬取的方法,并结合代理IP爬取小说为例子,帮助读者了解如何使用Python多进程和代理IP来进行爬取,以提高爬取效率和规避反爬机制。

Python使用多进程及代理ip爬取小说_HTML

一、使用多进程爬取小说

多进程是一种并发编程技术,它可以让程序同时运行多个进程。在爬虫中使用多进程可以提高爬取速度,因为多个进程可以同时从网页上下载数据。

以下是使用Python的多进程模块来实现小说爬虫的示例代码:

import requests
from bs4 import BeautifulSoup
from multiprocessing import Pool

def get_novel(novel_url):
    headers = {'User-Agent':'Mozilla/5.0'}
    response = requests.get(novel_url, headers=headers)
    soup = BeautifulSoup(response.text, 'html.parser')
    novel_title = soup.find('div', class_='title').text
    novel_content = soup.find('div', id='content').text
    with open(novel_title+'.txt', 'w', encoding='utf-8') as f:
        f.write(novel_content)
    print(novel_title+'下载完成!')

if __name__ == '__main__':
    urls = ['小说1网址', '小说2网址', '小说3网址', '小说4网址', '小说5网址']
    pool = Pool(processes=5)  # 开启5个进程
    pool.map(get_novel, urls)  # 执行函数

这段代码中,我们首先导入了requests和BeautifulSoup库,用于获取网页内容和解析HTML。

接着,我们定义了一个get_novel函数,该函数接受一个小说的URL链接为参数。函数中,我们使用requests库发送网络请求,获取小说的HTML页面,然后使用BeautifulSoup库解析HTML代码,找到小说标题和内容,并将小说内容保存到一个文本文件中。

最后,在if name == 'main':语句中,我们定义了一个urls列表,其中存储了需要爬取的小说链接。然后,我们使用multiprocessing模块的Pool函数创建了一个进程池,开启了5个进程,并使用pool.map()函数对urls列表中的每一个链接都执行get_novel函数。

运行这段代码后,程序将会同时下载5个小说,大大提高了爬取速度。

二、使用代理IP爬取小说

在爬虫中,我们经常会遇到一个问题:某些网站会对频繁访问它的IP进行封锁,导致我们无法正常爬取数据。为了应对这种情况,我们可以使用代理IP来隐藏我们的真实IP地址,从而避免被封锁。

以下是使用Python的代理IP来实现小说爬虫的示例代码:

import requests
from bs4 import BeautifulSoup

# 获取代理IP
def get_proxy():
    response = requests.get('http://127.0.0.1:5010/get/')
    proxy = response.text
    return proxy

# 删除无效代理IP
def delete_proxy(proxy):
    requests.get('http://127.0.0.1:5010/delete/?proxy={}'.format(proxy))

# 下载小说
def get_novel(novel_url):
    proxy = get_proxy()
    headers = {'User-Agent':'Mozilla/5.0'}
    proxies = {'http': 'http://' + proxy}
    try:
        response = requests.get(novel_url, headers=headers, proxies=proxies, timeout=5)
        soup = BeautifulSoup(response.text, 'html.parser')
        if '错误' in soup.find('title').text:
            print('IP被封禁,正在更换IP...')
            delete_proxy(proxy)
            get_novel(novel_url)
        else:
            novel_title = soup.find('div', class_='title').text
            novel_content = soup.find('div', id='content').text
            with open(novel_title+'.txt', 'w', encoding='utf-8') as f:
                f.write(novel_content)
            print(novel_title+'下载完成!')
    except:
        print('连接失败,正在更换IP...')
        delete_proxy(proxy)
        get_novel(novel_url)

if __name__ == '__main__':
    urls = ['小说1网址', '小说2网址', '小说3网址', '小说4网址', '小说5网址']
    for url in urls:
        get_novel(url)

这段代码中,我们定义了三个函数:get_proxy、delete_proxy、get_novel。

get_proxy用于从代理池中获取一个代理IP,delete_proxy用于删除无效的代理IP,get_novel用于下载小说。

在get_novel函数中,我们首先调用get_proxy函数获取一个代理IP,并将其加入proxies参数中。然后,我们使用requests库的get方法发送网络请求,获取小说的HTML页面。如果响应的title中含有“错误”字样,则说明IP被封禁,我们就调用delete_proxy函数删除该代理IP,并重新调用get_novel函数。

如果请求成功,则使用BeautifulSoup库解析HTML代码,找到小说标题和内容,并将小说内容保存到一个文本文件中。

最后,在if name == 'main':语句中,我们定义了一个urls列表,其中存储了需要爬取的小说链接。然后,我们使用for循环遍历urls列表,对每一个链接都调用get_novel函数。由于我们在get_novel函数中已经处理了代理IP的更换,因此不需要再使用多进程来加速爬取。

总结

本文介绍了如何使用Python的多进程模块和代理IP来爬取小说,提高了爬取速度并避免了IP被封锁的问题。需要注意的是,使用代理IP有一定风险,可能会遇到一些无效代理IP或被封禁的情况。因此,在使用代理IP时,我们需要对程序进行适当的异常处理。

标签:novel,get,Python,ip,爬取,proxy,IP,小说
From: https://blog.51cto.com/u_16022798/8617186

相关文章

  • 使用javascript求最小生成树
    在JavaScript中,求取最小生成树(Minimum Spanning Tree, MST)最常用的算法是Prim算法和Kruskal算法。这里我将提供一个基于Kruskal算法的JavaScript实现。首先,定义一个用于存储图的数据结构,这里使用JavaScript的类来实现:class Graph {      constructor(vertices) {   ......
  • python条件
    条件if语句if条件1:语句1elif条件2:语句2else:语句3if-els推导式ifexpression例:defabs7(n):returnnif(n>=0)else-nmatch-case语句match变量:case1:语句1case2:语句2case3:语句3case_:类似于default语句4case后的内容可以用|隔开,如1|2|3代码风格......
  • VS code中python代码格式化配置
    VScode中python代码格式化配置settings.jsonVScode打开命令面板(快捷键ctrlshiftP)搜settings.json发现里面有好几个设置:用户设置、工作区设置、文件夹设置、默认设置。其中默认设置一般不动,另外三个设置则是作用域一层层缩小:用户下所有文件=>工作区文件=>文件夹文件,可以......
  • windows安装zip和unzip命令
    进下面网页下载GnuWinGnuWindownload|SourceForge.net打开安装GnuWin,安装好在里面勾选这6项,zip和unzip各三个勾好点ApplyChanges安装过程装好会在这个目录里剩下就是配置环境变量,把上面路径加入系统路径“运行”输入“sysdm.cpl”,一键打开系统属性参考:Windows......
  • python task3
    python(三)条件if语句if-else语句推导式match...case语句match后的对象会依次与case后的内容进行匹配,如果匹配成功,则执行匹配到的表达式,否则直接跳过,_可以匹配一切case_:类似于C和Java中的default:,当其他case都无法匹配时,匹配这条,保证永远会匹配......
  • python连接数据库(连MySQL)
    Python操作和连接数据库原创 阳阳 Python小例子 2023-10-1109:20 发表于湖北在Python中,你可以使用不同的库来操作和连接数据库,最常用的是sqlite3、MySQLdb和psycopg2。使用sqlite3连接和操作SQLite数据库:import sqlite3# 连接数据库conn = sqlite3.connect('......
  • python "\r\n" 与 "\n" 与 "\r" 与 "\n\r" 的区别
    在Python中,这些是表示换行或回车的特殊字符序列。它们的区别在于它们在不同操作系统上的使用习惯。\n:表示换行符,通常用于Unix、Linux和类似系统中。\r:表示回车符,通常用于老式的MacOS系统。\r\n:表示回车后跟换行符,通常用于Windows系统。\n\r:这个组合在实践中不太常见,通常不被使......
  • JavaScript高级程序设计的代理与捕获——工作中的实际意义。
    js红宝书写得很好,很多东西都给你一一解释了,但是有一点我很想吐槽:没有在写代码例子之前说明,相关东西有啥用,在实际工作中有啥现实意义等等,导致很多人理解了概念和看懂了枯燥的代码段后却无法有效运用到自己的工作当中。因为你不知道拿来用到什么地方或者说什么情况下才去用它!举个我......
  • JavaScript编码风格指南
    sidebar:autosidebarDepth:4JavaScript编码风格指南内容出处:NicholasC.Zakas《编写可维护的JavaScript》GoogleJavaScriptStyleGuidecrockfordJSLintESLint好狗电影导航源文件基础命名文件名必须全部小写,并且可以包含下划线(_)或短划线(-),但不包含......
  • Java开发者的Python快速实战指南:探索向量数据库之文本搜索
    前言如果说Python是跟随我的步伐学习的话,我觉得我在日常开发方面已经没有太大的问题了。然而,由于我没有Python开发经验,我思考着应该写些什么内容。我回想起学习Java时的学习路线,直接操作数据库是其中一项重要内容,无论使用哪种编程语言,与数据库的交互都是不可避免的。然而,直接操作......