本文記錄了我學習的第一個爬蟲程序的過程。根據《Python數據分析入門》一書中的提示和代碼,對本身的知識進行查漏補缺。html
在上爬蟲程序以前補充一個知識點:User-Agent。它是Http協議中的一部分,屬於頭域的組成部分,User Agent也簡稱UA。它是一個特殊字符串頭,是一種向訪問網站提供你所使用的瀏覽器類型及版本、操做系統及版本、瀏覽器內核、等信息的標識。經過這個標識,用戶所訪問的網站能夠顯示不一樣的排版從而爲用戶提供更好的體驗或者進行信息統計;例如用不一樣的設備訪問同一個網頁,它的排版就會不同,這都是網頁根據訪問者的UA來判斷的。瀏覽器
電腦瀏覽器上能夠經過右擊網頁空白處——檢查元素——Network——單擊一個元素(若是沒有就刷新一下網站頁面)——下拉找到User-Agent。服務器
例如本機的UA爲:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.121 Safari/537.36app
網站服務器有時會經過識別UA的方式來阻止機器人(如requests)入侵,故咱們須要在爬蟲程序裏對本身的UA進行假裝。假裝的具體步驟看下文。ide
此次爬蟲的目標是豆瓣新書速遞頁面的信息,url爲https://book.douban.com/latest。可簡單分爲請求數據、解析數據、根據標籤提取數據、進一步提取數據和「漂亮的」打印五個步驟。函數
1、請求數據工具
import requests from bs4 import BeautifulSoup #請求數據 url = 'http://book.douban.com/latest' headers = {'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.121 Safari/537.36"} data = requests.get(url,headers=headers) #暫不輸入print(data.text)
2、解析數據學習
#解析數據 soup = BeautifulSoup(data.text, 'lxml') #暫不輸出print(soup)
3、根據標籤提取數據網站
對應在網頁源代碼中的表現是url
#觀察到網頁上的書籍按左右兩邊分佈,按照標籤分別提取 books_left = soup.find('ul',{'class':'cover-col-4 clearfix'}) #這一步的find,查找全部標籤爲ul,類class爲cover-col-4 clearfix的第一個內容 books_left = books_left.find_all('li') #這裏的find_all再次查找,查找上一步結果裏標籤爲li的內容 books_right = soup.find('ul',{'class':'cover-col-4 pl20 clearfix'})#爲L不爲1 books_right = books_right.find_all('li') books = list(books_left) + list(books_right) ''' find()查找第一個匹配結果出現的地方,find_all()找到全部匹配結果出現的地方。
通常用find()找到BeautifulSoup對象內任何第一個標籤入口。 '''
4、進一步提取,獲取所需信息
#對每個圖書區塊進行相同的操做,獲取圖書信息 img_urls = [] titles = [] ratings = [] authors = [] details = [] for book in books: #圖書封面圖片url地址 img_url = book.find_all('a')[0].find('img').get('src') #[0]指提取第一個a標籤的內容 img_urls.append(img_url) #圖書標題 title = book.find_all('a')[1].get_text() #get_text()方法:用來獲取標籤裏面的文本內容,在括號裏面加"strip=True"能夠去除文本先後多餘的空格 titles.append(title) #print(title) #評價星級 rating = book.find('p',{'class':'rating'}).get_text(strip=True) #rating = rating.replace('\n','').replace(' ',''),這一步的效果等同於在get_text里加上參數strip ratings.append(rating) #做者及出版信息 author = book.find('p',{'class':'color-gray'}).get_text() author = author.replace('\n','').replace(' ','') authors.append(author) #圖書簡介 detail = book.find_all('p')[2].get_text() #存疑!!detail = book.find('p',{'class':'detail'}).get_text() 報錯:'NoneType' object has no attribute 'get_text' detail = detail.replace('\n','').replace(' ','') details.append(detail)
img_url = book.find_all('a')[0].find('img').get('src') img_urls.append(img_url)
"能夠看出圖片地址在此‘信息塊’的第一個 a 標籤內,經過 find_all('a') 找到全部 a 標籤,再經過索引 [0] 提取第一個 a 標籤的內容,觀察可發現,URL在此 a 標籤下的 img 標籤內。一樣的方法,定位到此 img 標籤。應用 find 返回對象的 get 方法,獲取 src 對應的值,即爲要找到的 URL 地址。將此圖書的 URL 加入事先準備好的 img_urls 列表內,方便進一步的利用與存取操做。"
此方法能夠去除 find 返回對象內的 html 標籤,返回純文本。在括號裏面加 "strip=True" 能夠去除文本先後多餘的空格,效果同replace(' ','')和replace('\n','')。
5、「漂亮的」打印
for a,b,c,d,e in list(zip(img_urls,titles,ratings,authors,details)): print("封面圖片連接:{0}\n書名:{1} 評分:{2}\n做者及出版信息:{3}\n簡介:{4}\n\n".format(a,b,c,d,e))
封面圖片連接:https://img3.doubanio.com/view/subject/m/public/s32289202.jpg 書名:白日漫遊 評分:8.0 做者及出版信息:遠子/廣西師範大學出版社/2019-5 簡介:青年做家遠子最新力做,以十四篇彼此獨立而又互有呼應的短篇小說,刻畫在大都市掙扎求生的年輕人,描述一種渴望自由而又無往不在枷鎖之中的生活狀態。 封面圖片連接:https://img1.doubanio.com/view/subject/m/public/s32281237.jpg 書名:不識字的人 評分:9.5 做者及出版信息:[匈]雅歌塔·克里斯多夫/上海人民出版社/2019-4 簡介:28個虛構故事和1部自傳體小說。《惡童日記》做者雅歌塔流亡記憶的隱祕迴響,冷峻精簡的語言質感,道盡暗涌的記憶與真實的人生痛感。 封面圖片連接:https://img1.doubanio.com/view/subject/m/public/s32305167.jpg 書名:爲什麼,以及如何謀劃一場火災 評分:8.7 做者及出版信息:[美]傑西·鮑爾(JesseBall)/中信出版集團/2019-4 簡介:露西婭的父親死了,母親進了精神病院,她和姑媽住在別人的車庫裏。她又一次被學校勒令退學……在新學校,她遇到一個神祕組織,一羣能夠改變生活的人。 封面圖片連接:https://img3.doubanio.com/view/subject/m/public/s32304855.jpg 書名:呼嘯山莊 評分:9.2 做者及出版信息:【英】愛米麗·勃朗特/浙江文藝出版社/2019-5 簡介:呼嘯山莊裏的三代恩怨。愛米麗·勃朗特名著新版。 封面圖片連接:https://img1.doubanio.com/view/subject/m/public/s32323469.jpg 書名:苔 評分:8.6 做者及出版信息:周愷/楚塵文化/中信出版集團/2019-5 簡介:一個晚清家族,一出袍哥傳奇,一場歷史風暴,一曲時代輓歌。在「三千年未有之大變局」下,再現了蜀中各個階層的人物命運。 封面圖片連接:https://img1.doubanio.com/view/subject/m/public/s32295228.jpg 書名:推理時鐘 評分:8.6 做者及出版信息:[日]貴志祐介/新星出版社/2019-5-1 簡介:貴志祐介的推理短篇小說集,共分爲四個短篇,主要描寫了偵探榎本與犯罪者的頭腦戰。本格密室推理佳做,在日本年度推理榜單上多次上榜。
總結:上述代碼的主要工做就是,先將網頁數據轉化爲 soup 對象,再運用 soup 對象的一些方法逐步獲取須要的數據。經常使用方法具體可參考 bs4 官方文檔。本文所寫的是最基礎最簡單的爬蟲,筆者感受若是想本身的爬蟲水平更進一步,必定要熟悉 bs4 的方法,多瞭解HTML、JS等方面的知識,爬蟲所需瞭解它們的程度不深,但必須對其有所涉及。任重而道遠!