抓取网页生成电子书(行行网电子书多线程爬取-撸代码代码非常简单-写在前面 )

优采云 发布时间: 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,有需要的可以留言,我会单独发给你

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线