python爬取豆瓣图书前250
最近在學習python爬蟲系列課程,也在學習寫一些程序實例,這篇文章是爬取豆瓣圖書的前250本數的名稱和其他信息。
前期準備
1.安裝適合的python編輯器,本人使用的是Anaconda中的Jupyter Notebook,因為便于編寫和管理python的各種第三方庫,所以推薦大家也使用。下載地址為:https://www.anaconda.com/download/
2.本文章要使用python庫中的requests和BeautifulSoup4庫爬取網頁和解析網頁。因為不是python自帶的標準庫,所以要手動安裝以上兩個庫。
- requests庫下載地址:https://pypi.python.org/pypi/requests/
- Beautiful Soup4庫下載地址:https://pypi.python.org/pypi/beautifulsoup
3.用pip安裝以上兩個庫,Win+R打開輸入cmd, 輸入如下:
pip install requests pip install beautifulsoup4網頁分析
下面我們開始我們的爬蟲程序主體,我們將要訪問的是豆瓣圖書的前250榜單的書名和其他信息
https://book.douban.com/top250?
如下圖:
下面我們檢索我們所需要的字段所在的標簽,右鍵打開源代碼檢查元素,我們以查詢“追風箏的人”書名為例查找所在的標簽;如下圖:
我們可以看到所有的字段都存儲在標簽div{'class':'indent'}中,每個字段都在各個table標簽中,書名稱在div{'class':'p12'}的a 標簽中,其他信息在p標簽中{’class':'pl'}中。如下圖:
下面我們還要看到250本書在10個頁面中,要全部爬取下來我們還需要觀察更多的網頁結構:
第一個網頁的鏈接為:https://book.douban.com/top250?
第二個網頁的鏈接為:https://book.douban.com/top250?start=25
第三個網頁的鏈接為:https://book.douban.com/top250?start=50
我們可以發現第二、三頁鏈接上有個start=?,可以判斷為每頁的起始值為0,25,50...
上面的每頁都有類似的結構,我們可以開始編寫我們的主程序。
程序結構
先導入我們所需要的requests庫Beautiful Soup庫;
import requestsfrom bs4 import BeautifulSoup
然后來編寫我們程序的主體框架;
def getHTMLText(url): #獲得所需要的網頁頁面信息returndef get_data(list,html): #從網頁中獲取頁面信息,并存入列表中 returndef print_data(list): #將存儲在列表中的信息輸出打印出來def main(): main()接下來我們根據各個函數的目的,填充函數內的內容,第一個函數是要獲取頁面的信息;
def getHTMLText(url):try:r = requests.get(url ,timeout = 30)r.raise_for_status()r.encoding =r.apparent_encodingreturn r.textexcept:return "產生異常"第二個函數是要獲取數據,并存儲在列表中;
def get_data(list,html):tables = BeautifulSoup(html, 'html.parser').find('div', {'class':'indent'}).find_all('table')#在div標簽中找到所有的table標簽 ?for table in tables: #在所有的table標簽中遍歷元素 title = table.find('div', {'class':'pl2'}).find('a').get_text() #找到書名所在的a標簽info = table.find('p', {'class':'pl'}).get_text() #找到其他信息所在的p標簽list.append([title.strip(),info.strip()]) #將其存儲列表,用strip()出去其中的空字符串第三個函數是將列表中的數據輸出打印出來;
def print_data(list):print("{:^6}\t{:^10}\t{:^16}".format('序號','書名','信息'))count = 0 #用count來表示爬取的序號for b in list:count += 1print("{:^6}\t{:^16}\t{:^16}".format(count,b[0],b[1]))最后我們來編寫主函數;
def main():start_url = 'https://book.douban.com/top250?' #這是起始也的urldepth = 10 #我們爬取的深度為10頁info_list = []for i in range(depth): #在每頁中進行遍歷url = start_url + str(25*i) #實際的url是原始url加上start=? html = getHTMLText(url) #解析每頁的網頁信息get_data(info_list,html) #獲取數據print_data(info_list) #打印輸出最后的列表 main()上面我們就全部編寫完成這個爬蟲程序,輸出如下;
上面我們爬取的250本的豆瓣圖書信息,但是不知道為什么我們使用的strip()除去空字符,在三體這本書還是有空字符存在。希望大家指點方法解決。
程序代碼
上面我們成功的寫完了豆瓣爬蟲的代碼,并成功輸出了我們大致所要的結果,全部代碼如下;
import requests from bs4 import BeautifulSoupdef getHTMLText(url):try:r = requests.get(url ,timeout = 30)r.raise_for_status()r.encoding =r.apparent_encodingreturn r.textexcept:return "產生異常"def get_data(list,html):tables = BeautifulSoup(html, 'html.parser').find('div', {'class':'indent'}).find_all('table')for table in tables: title = table.find('div', {'class':'pl2'}).find('a').get_text()info = table.find('p', {'class':'pl'}).get_text()list.append([title.strip(),info.strip()])def print_data(list):print("{:^6}\t{:^10}\t{:^16}".format('序號','書名','信息'))count = 0for b in list:count += 1print("{:^6}\t{:^16}\t{:^16}".format(count,b[0],b[1]))def main():start_url = 'https://book.douban.com/top250?'depth = 10info_list = []for i in range(depth):url = start_url + str(25*i)html = getHTMLText(url)get_data(info_list,html)print_data(info_list) main()總結
1.爬蟲主要用requests庫和Beautiful Soup庫可以簡明地爬取網頁上的信息;
2.先定好程序主要框架,再根據目的需求填充函數內容:獲取網頁信息>爬取網頁數據>打印輸出;
3.對于所有的信息存儲于多頁,要觀察網頁信息,構造每頁的url鏈接來解決;
3.最重要的是解析網頁結構,最好可以用標簽樹的形式確定字段所在的標簽,并遍歷全部標簽存儲數據。
總結
以上是生活随笔為你收集整理的python爬取豆瓣图书前250的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java多线程--内存模型(JMM)--
- 下一篇: eureka-client无法启动com