爬蟲界裏我孔乙己,讀書人的事情能說偷嗎? 這叫借!那我們就講講怎麼借一本
慶餘年
來觀摩觀摩! 說笑了,這是魯迅
筆下的一篇小說叫做孔乙己
,裏面有這樣的一個橋段,那日,孔乙己偷拿了一本書,被衆人發現之後,孔乙己便漲紅了臉,額上的青筋條條綻出,爭辯道,“竊書不能算偷……竊書!……讀書人的事,能算偷麼?”接連便是難懂的話,什麼“君子固窮”,什麼“者乎”之類,引得衆人都鬨笑起來:店內外充滿了快活的空氣。
如果孔乙己也會爬蟲,那這當然不算偷咯!這叫技術,專業的!
因爲我也是剛學爬蟲的,很多不會還請指教指教,那下面我講講我是如何實現的我要的功能,我分爲三大步驟,爬蟲準備,爬蟲代碼,存放文件,其次,後面還有我遇到的巨坑,我會講講我是如何闖關的,最後是我的一點小心得,希望能對各位有幫助,覺得好的點個贊收藏關注一波,覺得不好的,評論區留言錘死博主
😁
爬蟲準備:
- 函數庫: requests , re, lxml, os
- 工具: python 3.7 和 pycharm2019
- 分析網站: 起點中文網
- 查看網頁源代碼編寫xpath語法:
庫的下載:
這裏的第一步就是庫的下載,那我們開始吧,這幾個庫的安裝就簡單的pip安裝就可以了,相信大家都會的,我就不敢班門弄斧了😂😂😂
分析網站:
我們要分析的網站時起點中文網
,裏面有很多小說,那這次我們就拿慶餘年
來實例實例,思路如下,通過含有目錄的網址,獲得每個章節的網址,然後遍歷每個章節網址,從而獲得每個章節網址中的文本信息!
這裏不知道又有多少人矇蔽了,那我們給個圖看看吧!
就是通過f12, 然後獲取指定位置的源代碼,這一章節的全部內容在第二個
div中的class="volume"標籤中,然後又在ul中的class=“cf” 裏面,最後又在li標籤中的a標籤的文本中,諤諤,,這聽着有點繞口,不過這確實要符合xpath的語法規格,這裏就將就的用我寫的xpath語法吧,//div[@class = "volume"][2]//ul[@class = "cf"]//li/a/text()
, 如果這裏不會xpath的朋友們也可以試着用正則來寫下,都是差不多的,那下面給出源代碼:
def get_page_url(urls, headers): # 給定目錄網址,獲得每個章節的網址
r = requests.get(urls, headers=headers)
html = etree.HTML(r.text) # 形成xpath對象
html = etree.tostring(html) # 修改代碼
html = etree.fromstring(html) # 轉換格式 不加就會出錯
result = html.xpath(
'//div[@class = "volume"][2]//ul[@class = "cf"]//li/a/@href') # 目前先確定第二個div標籤 獲得改標籤下網址
result = ['http:' + i for i in result] # 拼接網址
name = html.xpath('//div[@class = "volume"][2]//ul[@class = "cf"]//li/a/text()') # 確定第二個div標籤的文章標題
return result, name
這裏我不光獲取了每個章節的網頁鏈接,還獲取了每個章節的標題,以便後續存入文件中使用!
編寫代碼:
那從上面的代碼中我們獲取了每個章節的網址鏈接和標題,那下面我們就進入下一個操作,獲取每個章節中的文本信息,這裏我們打開第一章來查看查看😕😝
這裏我們可以在右側看到文本信息了吧,據我分析,他是在一個div標籤中屬性爲class="read-content j_readContent"的下屬p標籤的文本中,那我也給出我的xpath語法出來
//div[@class="read-content j_readContent"]/p/text()
, 哦哦, 這裏要說一句,xpath語法很簡單的,如果有人想讓我出一期xpath教學,就在下面評論區留言哦,那下面我也給出代碼:
def get_page_text(urls, headers): # 根據每一頁的網址 獲得其中的文本信息 然後返回給主函數
text = [] # 文本
for i in urls: # 遍歷這個列表
r = requests.get(i, headers=headers)
if r.status_code == 200: # 如果請求正常
s = re.sub(r':', '', r.text)
page_html = etree.HTML(s) # 形成xpath對象
page_html = etree.tostring(page_html) # 修改代碼規格
# print(page_html.decode('utf-8'))
page_html = etree.fromstring(page_html) # 轉換格式
page_text = page_html.xpath(
'//div[@class="read-content j_readContent"]/p/text()') # 尋找真實網址
text.append(page_text)
print(text)
return text # 該文本還需要修改碼片
代碼的註釋我在上面已經很詳細的寫了,可以看看哦 😘
存放文件:
因爲上面獲取了每個章節的文本和標題,那下面我們存放文件就很舒服了,直接寫入文本信息吧,利用os庫,創建我們的專屬文件夾,就像這樣
def write_page_text(text, title): # 根據獲得的文本 和 標題 然後寫入文件夾中
path = 'D://慶餘年//'
if not os.path.exists(path): # 如果目錄不存在的話
os.mkdir(path) # 創建這個目錄
os.chdir(path) # 進入這個目錄
else:
os.chdir(path) # 進入這個目錄
for i in zip(title, text): # 形成拉鍊
s = ''.join(i[1])
with open('第' + str(count - 1) + '卷. ' + i[0] + '.txt', 'a+', encoding='utf-8') as fw:
fw.write(i[0] + '\n')
fw.write(s)
print(f'{i[0]}: 已經下載完成!')
爬蟲巨坑:
巨坑一:
- 請求失敗
剛開始啥都不是很懂,就直接用原始代碼區爬取了,導致一直不穩定很容易出錯,後面纔想起了要加一個請求頭
,這樣我的第一個bug就修復好了
巨坑二:
- xpath中AttributeError: ‘bytes’ object has no attribute ‘xpath’
這個問題也困擾了我很久很久,我上百度找了很久,終於在一個國外論壇上找到了,這裏需要加入一個函數etree.fromstring(html)
這樣這個問題就弄好了
巨坑三:
- 虛假網址:?????我是爬了一個寂寞吧?
從獲得章節網址的沾沾自喜,就被爬蟲啪啪打臉,怎麼頁獲取不了章節內容,我一致懷疑我的語法問題,一直修改修改,到後面從某本書上知道了,還有虛假網址一說,我瞬間明白了,原來從元素
中的網址是要經過js渲染之後纔有的效果,所以我在網絡
中找到了我的要的準確網址,從而獲取了正確的內容
小小心得:
爬蟲不是萬能的,但是是最爽的,哈哈哈,能做好多好多事情呢,雖然這次爬蟲遇到不少的坑,差點就讓我放棄了這個實例,但是經過圈內好友的提醒,還有網上的知識,我終於還是成功了,這是一個自學爬蟲不到一個禮拜的小萌新做的,那我相信你們也是可以的哈,所以,給我一個贊啦😥😥😥
😂
那今天就到這裏結束了哈! 下次再見!