您好,登錄后才能下訂單哦!
最近想找?guī)妆倦娮訒纯?,就翻啊翻,然后呢,找到了一個(gè) 叫做 周讀
的網(wǎng)站 ,網(wǎng)站特別好,簡(jiǎn)單清爽,書籍很多,而且打開都是百度網(wǎng)盤可以直接下載,更新速度也還可以,于是乎,我給爬了。本篇文章學(xué)習(xí)即可,這么好的分享網(wǎng)站,盡量不要去爬,影響人家訪問速度就不好了 http://www.ireadweek.com/
,想要數(shù)據(jù)的,可以在我博客下面評(píng)論,我發(fā)給你,QQ,郵箱,啥的都可以。
這個(gè)網(wǎng)站頁面邏輯特別簡(jiǎn)單 ,我翻了翻 書籍詳情頁面 ,就是下面這個(gè)樣子的,我們只需要循環(huán)生成這些頁面的鏈接,然后去爬就可以了,為了速度,我采用的多線程,你試試就可以了,想要爬取之后的數(shù)據(jù),就在本篇博客下面評(píng)論,不要搞壞別人服務(wù)器。
http://www.ireadweek.com/index.php/bookInfo/11393.html
http://www.ireadweek.com/index.php/bookInfo/11.html
....
代碼非常簡(jiǎn)單,有咱們前面的教程做鋪墊,很少的代碼就可以實(shí)現(xiàn)完整的功能了,最后把采集到的內(nèi)容寫到 csv
文件里面,(csv
是啥,你百度一下就知道了) 這段代碼是IO密集操作
我們采用aiohttp
模塊編寫。
拼接URL,開啟線程。
import requests
# 導(dǎo)入?yún)f(xié)程模塊
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))
# 創(chuàng)建一個(gè)session 去獲取數(shù)據(jù)
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多個(gè)線程,但是這樣子很容易造成別人的服務(wù)器癱瘓,所以,我們必須要限制一下并發(fā)次數(shù),下面的代碼,你自己嘗試放到指定的位置吧。
sema = asyncio.Semaphore(5)
# 為避免爬蟲一次性請(qǐng)求次數(shù)太多,控制一下
async def x_get_source(url):
with(await sema):
await get_content(url)
處理抓取到的網(wǎng)頁源碼,提取我們想要的元素,我新增了一個(gè)方法,采用lxml
進(jìn)行數(shù)據(jù)提取。
def async_content(tree):
title = tree.xpath("http://div[@class='hanghang-za-title']")[0].text
# 如果頁面沒有信息,直接返回即可
if title == '':
return
else:
try:
description = tree.xpath("http://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("豆瓣評(píng)分:","") if description[0].xpath("p[3]/text()")[0] is not None else None
# 這部分內(nèi)容不明確,不做記錄
#des = description[0].xpath("p[5]/text()")[0] if description[0].xpath("p[5]/text()")[0] is not None else None
download = tree.xpath("http://a[@class='downloads']")
except Exception as e:
print(title)
return
ls = [
title,author,cate,douban,download[0].get('href')
]
return ls
數(shù)據(jù)格式化之后,保存到csv
文件,收工!
print(data)
with open('hang.csv', 'a+', encoding='utf-8') as fw:
writer = csv.writer(fw)
writer.writerow(data)
print("插入成功!")
Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進(jìn)階,都?xì)g迎
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。