python多线程爬虫爬取顶点小说内容(BeautifulSoup+urllib)

思路

之前写过python爬取起点中文网小说,多线程则是先把爬取的章节链接存到一个列表里,然后写一个函数get_text每次调用这个函数就传一个章节链接,那么就需要调用n次该函数来获取n章的内容,所以可以用for循环创建n个线程,线程的target就是get_text,参数就是章节的url。

被爬取页面

随便点开的,辣眼睛哈哈哈

全部章节页

from bs4 import *
import socket
import time


#在小说章节页爬取所有章节链接
def get_html():
    
    #从你的浏览器控制台复制出http报文的header信息
    header = {'User-Agent':'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0'}
    url = 'https://www.dingdiann.com/ddk81000/'
    
    #发送一个http请求,读出网页内容存到html
    req = urllib.request.Request(url,headers=header)
    html = urllib.request.urlopen(req).read()

    #网页里有中文,需要decode
    html.decode('utf-8','ignore')
    
    #用BeautifulSoup处理html 不加‘lxml’参数会警告
    soup = BeautifulSoup(html,'lxml')
    
    #chapters用来存放所有章节的链接
    chapters = []
    
    dds = soup.find_all('dd')
    for dd in dds:
        chapters.append('https://www.dingdiann.com'+dd.a.get('href'))
        #print(dd.a.get('href'))
    return chapters

#获取章节文本信息
def get_text(url):
    header = {'User-Agent':'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0'}
    req = urllib.request.Request(url,headers=header)
    
    response = urllib.request.urlopen(req)
    html = response.read().decode('utf-8','igore')
    
    #关闭请求 防止服务器拒绝服务
    response.close()
    
    soup = BeautifulSoup(html,'lxml')
    
    
    #title = soup.find(class_='bookname').h1.text
    try:
        #找到章节名
        title = soup.find(class_='bookname').h1.text
        
        #为中文字符串构造正则表达式,识别出“第X章”
        str = title.encode('utf-8')
        filename = re.search(u'.*章'.encode('utf-8'),str).group().decode('utf-8')
        #用追加方式打开文件,文件名是“第X章”
        f = open('C:/Users/liuxu/Desktop/book/'+filename+ '.txt','w+')
        #写入标题
        f.write(title+'\n\n')
        #逐行写入小说段落
        text = soup.find(id='content').text
        lines = re.findall(r'\s{2}\S*',text)
        for line in lines:
            f.write(line+'\n')
        #关闭文件
        f.close()
    except:
        #异常处理 防止因为出错而中断爬取程序
        print('error in writing')
        
          
#socket.setdefaulttimeout(20) 
threads = [] 
for chapter in get_html():
    th = threading.Thread(target=get_text,args=(chapter,))
    threads.append(th)

for t in threads:
    t.start()
    #每两个进程之间间隔3秒 防止报出错误“[WinError 10054] 远程主机强迫关闭了一个现有的连接”
    time.sleep(3)

爬取结果

想和大家讨论的部分

个人感觉用了多线程之后速度并没有很大的提升,速度大致是20个txt文件/分钟,是否有单个机器上继续提升爬取速度的方法?

下一步打算搞点能被封ip的爬取行为,然后学学分布式爬虫。加油~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端黑板报

HTTP2基础教程-读书笔记(四)

? 记录一下HTTP/2的底层原理,帮助理解协议实现细节。 连接 每个端点都需要发送一个连接作为最终确认使用的协议,并建立http/2连接的初始设置。客户端和...

3536
来自专栏芋道源码1024

注册中心 Eureka源码解析 —— 应用实例注册发现 (九)之岁月是把萌萌的读写锁

本文主要分享 Eureka 注册中心的那把读写锁,让我瘙痒难耐,却不得其解。在某次意外的抠脚的一刻( 笔者不抽烟,如果抽烟的话,此处应该就不是抠脚了 ),突然顿...

1010
来自专栏分布式系统进阶

Influxdb 数据写入流程

因此对写入请求的处理就在函数 func (h *Handler) serveWrite(w http.ResponseWriter, r *http.Reque...

2013
来自专栏腾讯云API

【转】腾讯云 TCCLI 实践分享

原文地址:https://cloud.tencent.com/developer/article/1158013

1793
来自专栏iOS开发随笔

iOS Swift 读取本地json文件

1995
来自专栏小詹同学

Python爬虫实例之——小说下载

这是小詹关于爬虫的第②篇文章! 第一篇关于爬虫中介绍了一些基本的术语和简单的操作,这里不重复叙述了,直接放链接,不记得的自己在文章末尾点击前期链接补补~ 本篇开...

5335
来自专栏逆向技术

16位汇编第三讲 分段存储管理思想

      内存分段 一丶分段(汇编指令分段) 1.为什么分段?   因为分段是为了更好的管理数据和代码,就好比C语言为什么会有内存4区一样,否则汇编代码都写...

2126
来自专栏小狼的世界

Crontab中的除号(slash)到底怎么用?

crontab 是Linux中配置定时任务的工具,在各种配置中,我们经常会看到除号(Slash)的使用,那么这个除号到底标示什么意思,使用中有哪些需要注意的地方...

992
来自专栏祝威廉

Kafka Zero-Copy 使用分析

Kafka 我个人感觉是性能优化的典范。而且使用Scala开发,代码写的也很漂亮的。重点我觉得有四个

2062
来自专栏有趣的django

37.Django1.11.6文档

第一步 入门 检查版本 python -m django --version 创建第一个项目 django-admin startproject mysite ...

4948

扫码关注云+社区

领取腾讯云代金券