Python爬虫入门教程第十一讲: 行行网电子书多线程爬取

作者 : 开心源码 本文共2644个字,预计阅读时间需要7分钟 发布时间: 2022-05-12 共222人阅读

行行网电子书多线程爬取-写在前面

最近想找几本电子书看看,就翻啊翻,而后呢,找到了一个 叫做 周读的网站 ,网站特别好,简单清新,书籍很多,而且打开都是百度网盘可以直接下载,升级速度也还可以,于是乎,我给爬了。本篇文章学习就可,这么好的分享网站,尽量不要去爬,影响人家访问速度就不好了 http://www.ireadweek.com/ ,想要数据的,可以在我博客下面评论,我发给你,QQ,邮箱,啥的都可以。

在这里插入图片形容在这里插入图片形容

这个网站页面逻辑特别简单 ,我翻了翻 书籍介绍页面 ,就是下面这个样子的,我们只要要循环生成这些页面的链接,而后去爬即可以了,为了速度,我采用的多线程,你试试即可以了,想要爬取之后的数据,就在本篇博客下面评论,不要搞坏别人服务器。

http://www.ireadweek.com/index.php/bookInfo/11393.htmlhttp://www.ireadweek.com/index.php/bookInfo/11.html....

行行网电子书多线程爬取-撸代码

代码非常简单,有咱们前面的教程做铺垫,很少的代码即可以实现完整的功能了,最后把采集到的内容写到 csv 文件里面,(csv 是啥,你百度一下就知道了) 这段代码是IO密集操作 我们采用aiohttp板块编写。

第1步

拼接URL,开启线程。

import requests# 导入协程板块import asyncioimport aiohttpheaders = {"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("插入成功!")

行行网电子书多线程爬取-运行代码,查看结果

在这里插入图片形容

小编整理一套Python资料和PDF,有需要Python学习资料可以加学习群:1004391443,反正闲着也是闲着呢,不如学点东西啦~~

image

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Python爬虫入门教程第十一讲: 行行网电子书多线程爬取

发表回复