python多线程爬虫 爬取多个网页_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的爬取行为,然后学学分布式爬虫。加油~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值