當前位置:
首頁 > 最新 > 新手爬蟲第一彈

新手爬蟲第一彈

第一彈

人生苦短

導語

這次爬取的是妹子圖(meizitu.com),算是一個非常適合新手的網站。

完成這次的項目主要用到以下幾個庫:

importrequests

frommultiprocessingimportPool

fromrequests.exceptionsimportRequestException

importsys

frombs4importBeautifulSoup

importos

fromhashlibimportmd5

importpymongo

主要實現了圖集、圖片鏈接存儲到mongoDB資料庫,下載圖片到本地,圖片去重。

分析目標站

訪問網站就可以看到很多讓人熱血賁張的套圖了,首先我們翻到最下面,尋找爬蟲的入口,好的爬蟲入口往往可以讓你事半功倍。

翻到網站的最後可以看到翻頁的按鈕,我們通過點擊不同的頁面來查看網頁鏈接是否有什麼變化。

可以看到點擊頁面地址欄中鏈接中的數字在不斷增加,例如下面是第五頁的鏈接:

http://www.meizitu.com/a/more_5.html,所以我們可以根據這個鏈接構建我們請求的URL。

#構建每一頁的鏈接

defget_index_page(page_number):

url ="http://www.meizitu.com/a/more_{}.html".format(page_number)

try:

reponse = requests.get(url,headers=headers)

reponse.encoding = reponse.apparent_encoding

ifreponse.status_code ==200:

returnreponse.text

return None

exceptRequestException:

print("請求列表頁錯誤")

return None

分析圖集列表頁面

尋找完入口URL之後我們開始分析單個圖集列表頁面,先拿到單個頁面所有圖集的鏈接,我們可以使用bs4直接解析出來,可以使用瀏覽器直接得到要採集元素的信息。

圖集詳情中每張圖片的鏈接的解析方法和這個是一樣的,就不再贅述。

#解析列表頁,把每一頁中的單個圖集鏈接解析出來

defparse_index_page(html):

url = []

soup = BeautifulSoup(html,"lxml")

url_list = soup.select("圖第三點中複製的信息")

length =len(url_list)

foriinrange(length):

url = url + [url_list[i].attrs["href"]]

returnurl

下載圖片至本地並去重

下載圖片其實就是將要存儲的文件以二進位流的方式保存下來。

重點還是放在去重上,這裡使用了hashlib模塊,因為每一張圖片的MD5值都是唯一的,如果MD5值相同就代表是同一張圖片我們就不做下載。

#下載圖片

defdownload_image(url):

print("正在下載",url)

try:

reponse = requests.get(url,headers=headers)

ifreponse.status_code ==200:

# print(reponse.text)

save_image(reponse.content)

return None

exceptRequestException:

print("請求下載圖片錯誤",url)

return None

#保存圖片,校驗去重

defsave_image(content):

file_path ="/.".format(os.getcwd(),md5(content).hexdigest(),"jpg")

if notos.path.exists(file_path):

withopen(file_path,"wb")asf:

f.write(content)

f.close()

存儲到mongoDB資料庫

首先你要安裝好mongoDB資料庫(廢話),接下來就是基本的mongoDB操作。

#保存到mongoDB資料庫

defsave_to_mongo(result):

ifdb[MONGO_TABLE].insert(result):

print("存儲到mongoDB成功",result)

return True

return False

尾言

本來還用了多進程,但是爬取到50幾頁的時候就卡住不動了,個人感覺是因為鏈接的獲取進程沒趕上下載的進程,當然這只是我的一家之言(其實是我瞎編的,hhhhh)

經過一個小時的奮戰,成果如下:

爬取這個網站的時候還是遇到了一點下問題是之前自學的時候沒有注意的在這裡做一個標註:

1.獲取網頁內容的時候網頁中文顯示亂碼,可以通過獲取網站的編碼對自己獲取的網站內容再編譯來解決。

reponse.encoding = reponse.apparent_encoding

2.多進程並不是什麼情況下用都是利好的。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 翻身鹹魚把歌唱 的精彩文章:

TAG:翻身鹹魚把歌唱 |