行行網電子書多執行緒爬取-寫在前面
最近想找幾本電子書看看,就翻啊翻,然後呢,找到了一個 叫做 周讀
的網站 ,網站特別好,簡單清爽,書籍很多,而且開啟都是百度網盤可以直接下載,更新速度也還可以,於是乎,我給爬了。本篇文章學習即可,這麼好的分享網站,儘量不要去爬,影響人家訪問速度就不好了 http://www.ireadweek.com/
,想要資料的,可以在我部落格下面評論,我發給你,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了,有需要的留言吧,我單獨傳送給你