Python 爬虫分析豆瓣 TOP250 之 信息字典 和 马斯洛的锥子
問(wèn)題
本文是對(duì)《Python 爬蟲(chóng)分析豆瓣 TOP250 告訴你程序員業(yè)余該看什么書(shū)?》 一文的補(bǔ)充
我們以《追風(fēng)少年》為例
用chrome的developer tool查看源代碼
這里發(fā)現(xiàn),源代碼的HTML比較難以分析(Parse)。
在原作者的文中,把這些都放在了一起。
[美] 卡勒德·胡賽尼 / 李繼宏 / 上海人民出版社 / 2006-5 / 29.00元而這樣并不能滿足我的要求(知識(shí)圖譜)。
一開(kāi)始,我也嘗試著用xpath里面的sibling, next等去抓信息,但是都失敗了。后來(lái)恍然大悟。其實(shí),如果單單從頁(yè)面上看,這明明就是key value pair,用冒號(hào)隔開(kāi)。于是,我直接把字符串抓出來(lái),很容易就搞定了。
信息字典
理想情況下,抓出來(lái)的信息是這個(gè)樣子的。
作者: [美] 卡勒德·胡賽尼 出版社: 上海人民出版社 出品方: 世紀(jì)文景 原作名: The Kite Runner 譯者: 李繼宏 出版年: 2006-5 頁(yè)數(shù): 362 定價(jià): 29.00元 裝幀: 平裝 叢書(shū): 卡勒德·胡賽尼作品 ISBN: 9787208061644這樣,一行行分析就行了。
但實(shí)際上,抓出來(lái)的信息是這樣的
作者: [美]卡勒德·胡賽尼出版社: 上海人民出版社 出品方: 世紀(jì)文景 原作名: The Kite Runner 譯者: 李繼宏出版年: 2006-5 頁(yè)數(shù): 362 定價(jià): 29.00元 裝幀: 平裝 叢書(shū): 卡勒德·胡賽尼作品 ISBN: 9787208061644不過(guò),也沒(méi)關(guān)系,用正則表達(dá)式抓到所有的key。這樣key之間的就是value了。
具體代碼如下。(python 3.7)
# -*- coding: utf-8 -*- """ Created on Wed Feb 27 12:08:08 2019@author: eric """import requests from lxml import etree from bs4 import BeautifulSoup import time import reclass Douban_Book():url = ""title_cn=""title_original="" #原作名author=""author_profile = ""publisher="" #出版社publish_date=""pages=""price=""series=""isbn=""rating = 0.0votes = 0summary = ""HEADERS = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}def get_urls():#https://book.douban.com/top250?start=225url_base = "https://book.douban.com/top250?start="urls = [url_base+str(i*25) for i in range(10)]return urlsdef get_dict_value(the_dict, key, defualt_value=""):if key in the_dict:return the_dict[key]return defualt_valuedef get_book(book_url):response = requests.request("get", book_url, headers=HEADERS)soup = BeautifulSoup(response.text, "html.parser")book = Douban_Book()book.url = book_urlbook.title_cn = soup.find("h1").text.strip()#以下是信息字典soup_info = soup.find("div",{"id":"info"})info_text = soup_info.textheads = re.findall("\n.+:",info_text)info_dict = {}for i in range(len(heads)-1):start_at=info_text.find(heads[i])+len(heads[i])end_at=info_text.find(heads[i+1])value = info_text[start_at:end_at].strip().replace("\n","")value = re.sub("\s+"," ",value)key = heads[i].strip().replace(":","")info_dict[key]=value#the last key value pairstart_at=info_text.find(heads[-1])+len(heads[-1])value = info_text[start_at:].strip().replace("\n","")key = heads[-1].strip().replace(":","")info_dict[key]=value#把信息字典里的信息寫(xiě)入book對(duì)象book.author = get_dict_value(info_dict, "作者")book.isbn = get_dict_value(info_dict, "ISBN")book.pages = get_dict_value(info_dict, "頁(yè)數(shù)")book.price = get_dict_value(info_dict, "定價(jià)")book.publish_date = get_dict_value(info_dict, "出版年")book.publisher = get_dict_value(info_dict, "出版社")book.series = get_dict_value(info_dict, "叢書(shū)")book.title_original = get_dict_value(info_dict, "原作名")#豆瓣評(píng)分book.rating = float(soup.find("strong",{"class":"ll rating_num "}).text.strip())#<span property="v:votes">405241</span>book.votes = int(soup.find("span",{"property":"v:votes"}).text)#簡(jiǎn)介intros = soup.find_all("div",{"class":"intro"})for p in intros[0].find_all("p"):book.summary+=p.text+"\r\n"for p in intros[1].find_all("p"):book.author_profile+=p.text+"\r\n"return bookdef save_book(book):print("saving book {0} {1}".format(book.title_cn, book.title_original))pass#https://book.douban.com/top250?start=0 def parse_list(list_url):response = requests.request("get", list_url, headers=HEADERS)tree = etree.HTML(response.text)trs=tree.xpath("//tr[@class='item']")for tr_item in trs:book_url=tr_item.xpath("descendant::a[1]/@href")[0]book = get_book(book_url)save_book(book)def main():urls = get_urls()for url in urls[:1]:parse_list(url)time.sleep(1.1)馬斯洛的錐子
有時(shí)候,我們用慣了爬蟲(chóng)工具,會(huì)陷進(jìn)爬蟲(chóng)工具的牛角尖里面?;蛘哒f(shuō),「如果你有的只是一個(gè)錘子,那麼所有的東西看起來(lái)都像一個(gè)釘子」 – Abraham Maslow。
總結(jié)
以上是生活随笔為你收集整理的Python 爬虫分析豆瓣 TOP250 之 信息字典 和 马斯洛的锥子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Word 如何从任意页开始显示页码
- 下一篇: created和mounted的区别