抓取网页生成电子书(行行网电子书多线程爬取-撸代码代码非常简单-写在前面 )
优采云 发布时间: 2021-12-02 06:11抓取网页生成电子书(行行网电子书多线程爬取-撸代码代码非常简单-写在前面
)
星星网电子书的多线程爬取-写在前面
最近想找几本电子书看,然后找到一本叫周都网站,网站很好看,简单清爽,书很多,就是百度。网盘可以直接下载,更新速度也可以接受,所以在爬。这篇文章文章刚学习,这么好的分享网站,尽量不要爬,不会影响别人访问的速度,想要数据的可以评论我的博客我会发给你,QQ,邮箱,随便。
这个网站页面的逻辑很简单。我翻阅了本书的详细信息页面,它看起来像这样。我们只需要循环生成这些页面的链接,然后抓取即可。为了速度,我使用多线程。, 你可以试试看。如果以后想爬取数据,就在本博客下方留言,不要搞乱别人的服务器。
http://www.ireadweek.com/index.php/bookInfo/11393.html
http://www.ireadweek.com/index.php/bookInfo/11.html
....
星星网电子书多线程爬取-撸码
代码很简单,以我们之前的教程为铺垫,少量代码就可以实现完整的功能,最后将采集的内容写入到csv文件中,(什么是csv,你会知道百度)这段代码是IO密集型操作,我们使用aiohttp模块来编写。
第1步
拼接 URL 并启动线程。
import requests
# 导入协程模块
import asyncio
import aiohttp
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
"Host": "www.ireadweek.com",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"}
async def get_content(url):
print("正在操作:{}".format(url))
# 创建一个session 去获取数据
async with aiohttp.ClientSession() as session:
async with session.get(url,headers=headers,timeout=3) as res:
if res.status == 200:
source = await res.text() # 等待获取文本
print(source)
if __name__ == '__main__':
url_format = "http://www.ireadweek.com/index.php/bookInfo/{}.html"
full_urllist = [url_format.format(i) for i in range(1,11394)] # 11394
loop = asyncio.get_event_loop()
tasks = [get_content(url) for url in full_urllist]
results = loop.run_until_complete(asyncio.wait(tasks))
上面的代码可以同时开启N个多线程,但是这样很容易导致其他人的服务器瘫痪。因此,必须限制并发数。下面的代码,你试着把它放在指定的位置。
sema = asyncio.Semaphore(5)
# 为避免爬虫一次性请求次数太多,控制一下
async def x_get_source(url):
with(await sema):
await get_content(url)
第2步
为了处理获取的网页的源代码并提取我们想要的元素,我添加了一个新方法,使用 lxml 进行数据提取。
def async_content(tree):
title = tree.xpath("//div[@class='hanghang-za-title']")[0].text
# 如果页面没有信息,直接返回即可
if title == '':
return
else:
try:
description = tree.xpath("//div[@class='hanghang-shu-content-font']")
author = description[0].xpath("p[1]/text()")[0].replace("作者:","") if description[0].xpath("p[1]/text()")[0] is not None else None
cate = description[0].xpath("p[2]/text()")[0].replace("分类:","") if description[0].xpath("p[2]/text()")[0] is not None else None
douban = description[0].xpath("p[3]/text()")[0].replace("豆瓣评分:","") if description[0].xpath("p[3]/text()")[0] is not None else None
# 这部分内容不明确,不做记录
#des = description[0].xpath("p[5]/text()")[0] if description[0].xpath("p[5]/text()")[0] is not None else None
download = tree.xpath("//a[@class='downloads']")
except Exception as e:
print(title)
return
ls = [
title,author,cate,douban,download[0].get('href')
]
return ls
第 3 步
数据格式化后,保存成csv文件,收工啦!
print(data)
with open('hang.csv', 'a+', encoding='utf-8') as fw:
writer = csv.writer(fw)
writer.writerow(data)
print("插入成功!")
星星网电子书多线程爬取-运行代码,查看结果
因为这可能涉及到从别人的服务器获取重要数据,代码不会上传到github,有需要的可以留言,我会单独发给你