學這個之前請確保自己對http協議和html有些瞭解(不用全都會)
爬蟲是什麼?
爬蟲就是模擬瀏覽器去訪問鏈接,來幫助我們獲取想要的數據,可見即可爬(爬不到就是技術不夠)
瀏覽器是怎樣訪問網頁的呢?
瀏覽器會向一個網站發起一個請求,網站再作出響應,返回數據給瀏覽器,返回的數據就包含我們想要的東西。
不多嗶嗶,進入正文!
就拿起點中文網爲例,推薦使用Chrome瀏覽器,因爲火狐一次次讓我失望。
是不是很多小說?(雖然我一個也不看,全是一羣妄想家的白日夢,已經無藥可救 (艹皿艹 ))
點進第一本的目錄裏看看:
如果想把每一章的內容都保存下來的話,這他孃的也太多了吧,這擱誰誰受得了啊。。。。w(゚Д゚)w
橋豆麻袋!!!!我們還有爬蟲!管他有多少章節都得乖乖躺在朕的硬盤裏︿( ̄︶ ̄)︿
第一步:獲取書名的鏈接,按下F12鍵,鼠標定位到書名
每個書名都有對應的鏈接,我們需要拿到它,代碼裏會出現
Bigtit_list=html.xpath('//div[@class="book-mid-info"]/h4/a/text()')
Bigsrc_list=html.xpath('//div[@class="book-mid-info"]/h4/a/@href')
這個xpath超好用,不用我們寫正則表達式啦! (づ ̄3 ̄)づ╭❤~
第一行用於獲取class="book-mid-info"這個div控件下的h4標籤下的a標籤的文本值
第二行用於獲取class="book-mid-info"這個div控件下的h4標籤下的a標籤的鏈接值
接下來出現的類似代碼也是類似的功能
第二步:拿到書名和鏈接,我們訪問這個鏈接,就會到書的章節目錄裏面去,再按F12
第三步:訪問每一個章節鏈接把每一章的內容保存下來
每一章的章節名也會有文本和鏈接,拿到每一章的鏈接就能看到每一章裏面的內容了
思路有了,代碼怎麼寫呢?需要以下三個模塊
requests(發起請求)
os(文件管理)
lxml 的 etree(處理頁面響應的html)
翠花,上代碼!
import requests
import os
from lxml import etree
class Spider(object):#面向對象式編程
def start_request(self):#拿到小說名
response=requests.get("https://www.qidian.com/all")#發起請求訪問鏈接
html=etree.HTML(response.text)#將HTML代碼處理成樹狀結構
Bigtit_list=html.xpath('//div[@class="book-mid-info"]/h4/a/text()')
Bigsrc_list=html.xpath('//div[@class="book-mid-info"]/h4/a/@href')
for Bigtit,Bigsrc in zip(Bigtit_list,Bigsrc_list):#遍歷所有書名和鏈接
if os.path.exists(Bigtit)==False:
os.mkdir(Bigtit)#創建書名文件夾
self.file_data(Bigtit,Bigsrc)
def file_data(self,Bigtit,Bigsrc):#訪問書名鏈接獲取章節
url="http:"+Bigsrc;
response=requests.get(url)
print(url)
html=etree.HTML(response.text)
Littit_list=html.xpath('//ul[@class="cf"]/li/a/text()')
Litsrc_list = html.xpath('//ul[@class="cf"]/li/a/@href')
for Littit, Litsrc in zip(Littit_list, Litsrc_list):#遍歷所有章節
self.file_save(Littit,Litsrc,Bigtit)
def file_save(self,Littit,Litsrc,Big_tit):#訪問章節內容並保存
response=requests.get("http:"+Litsrc)
html=etree.HTML(response.text)
content="\n".join(html.xpath('//div[@class="read-content j_readContent"]/p/text()'))
file_name=Big_tit+"\\"+Littit+".txt"
print(file_name)
with open(file_name,"a",encoding="utf-8") as f:#保存章節內容
f.write(content)
s=Spider()
s.start_request()
代碼到此就沒有了,也不長,但是初學的時候確實不知道怎麼弄,還掰着正則表達式看了一通,不知道原來xpath這麼香。
小說這麼幹就能幹完了,想獲取其他的文本也是類似的,但是網站的反爬蟲機制可能會導致失敗,我這個沒有加request 的請求頭,加了可能也會失敗,比如這個代碼爬不到VIP章節內容,還可能封了我的IP,所以對抗反爬蟲的路也是很長的,學這麼點東西還遠遠不夠肆意妄爲的。
可以試試用這個獲取某些**網站的圖片和文字,看明白上邊的東西之後就不難了,不說了,大家保重身體 ┗|`O′|┛ 嗷~~