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