1. 程式人生 > >python爬蟲----汽車之家的汽車論壇的最新精華帖

python爬蟲----汽車之家的汽車論壇的最新精華帖

模組

  1. import requests---網頁請求
  2. import re---正則表示式
  3. from bs4 import BeautifulSoup as bs---節點處理

抓取的內容

這次主要抓取汽車之家的汽車論壇裡面的最新精華帖的內容,具體抓取帖子文字。url:https://club.autohome.com.cn/bbs/thread/71c8ec6ecd2ea90b/78107956-1.html#pvareaid=2237104

最新精華帖(選其中一篇抓取內容)

 

 選的帖子是了個心願----西藏行,主要抓取帖子裡面的正文

帖子的正文

網頁解析

通過檢視網頁的原始碼會發現有些文字被編碼&#x....;來替代了,得到的資料不完整。然後用Chrome瀏覽器的右鍵檢查可以發現有些文字是不看到的,直接抓取的話,拿到的資料不完整,看不到文字的地方抓取出來的亂碼的,格式為&#x....;,通過網頁的分析會在head標籤裡面發現樣式中有@font-face,css3裡面用到的規則,菜鳥教程裡面可以詳細瞭解,這是該網站自定義字型格式,常見的一種反爬方式之一。帖子的正文內容都在class為tz-paragraph的div,直接使用BeautifulSoup模組要取出要用到的結點即可soup.find(attrs={'class':'tz-paragraph'}).get_text()。 

原始碼+檢查
# 獲取原始碼
def get_html(url):
	headers={
		'Accept': '*/*',
		'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
	}
	try:
		resp = requests.get(url,headers=headers)
		if resp.status_code==200:
			return resp.content
	except Exception as e:
		return None


# 解析網頁
def parse_html(html):
	soup=bs(html,'lxml')
	tz_paragraph=soup.find(attrs={'class':'tz-paragraph'}).get_text()

    # 正則表示式去掉正文裡面的html標籤
	print(re.sub(r'<.*?>','',tz_paragraph))

解析文字

由於多次請求當前的帖子網頁,發現@font-face {font-family: 'myfont';src:url('//k2.autoimg.cn/g2/M04/D2/58/ChcCRFsUz3uANtwNAABkzqIWC2E84..eot');src: url('//k3.autoimg.cn/g2/M04/D2/58/ChcCRFsUz3uANtwNAABkzqIWC2E84..eot?#iefix') format('embedded-opentype'),url('//k3.autoimg.cn/g2/M0A/D0/38/wKgHFlsUz3uAFpoDAABkCDN_-ZM19..ttf') format('woff');},woff檔案的地址不變,而且內容沒有編碼和要解析的文字直接的關係不變,所以不需要每次都要下載該字型檔案再來匹配,只需要下載字型檔案用百度的FontEditor工具就可以看到編碼和文字的關係

根據上圖的編碼和文字的關係,直接手動設定對映關係,獲取網頁原始碼之後要進行編碼和文字之間的替換就可利用這對映關係來處理。 

def decode_font(html):

    # 手動設定編碼和文字的關係
	base_text=['左','著','壞','好','不','低',
			   '三','近','得','短','下','高',
			   '了','更','九','長','一','四',
			   '和','遠','小','大','多','呢',
			   '矮','八','狠','十','的','地',
			   '上','二','五','六','少','右',
			   '是','其']


	base_code=['$ECD0','$EC1D','$ED5D',
			   '$EDAF','$ECFC','$EC48',
			   '$EC9A','$EDDB','$EC39',
			   '$ED79','$ECC6','$ED18',
			   '$EC64','$EDA5','$EDF7',
			   '$ED43','$ED95','$ECE2',
			   '$EC2E','$EC80','$EDC1',
			   '$ED0D','$ED5F','$ECAC',
			   '$ECFE','$EC4A','$ED8B',
			   '$EDDD','$ED29','$EC76',
			   '$ECC8','$EE08','$EC66',
			   '$EDA7','$ECF3','$ED45',
			   '$EC92','$EDD2']
    # 將$ECD0----->&#xecd0的形式
	result=[code.replace('$','&#x').lower()+";"for code in base_code]
	# zip函式將列表打包為元組列表,dict函式將元組列表轉換為字典
	dictory = dict(zip(result, base_text))
	for key in dictory:
		if key in html:
			html=html.replace(key,str(dictory[key]))
	return html

 效果

我不知道究竟是什麼時候,西藏被賦予“淨化心靈”“人間淨土”這些明顯雞湯色彩的概念,在很早之前看到了很多什麼去西藏洗滌心靈,各種攻略眼花繚亂,各種標題黨譁眾取寵。彷彿在這汙濁的社會,唯有憋著一股勁去趟西藏,方可得到淨化,所以,西藏到底是怎麼樣的?那時在心裡就對西藏充滿了無盡的遐想,我也很想去看看,感受那片神祕的土地。。。。聽到盧焱的唱的歌《流浪》裡面有一句歌詞:我想出去走一走,看看這個大世界,還有很多的夢想去冒險,念過好幾遍,跟著心往前。我以為那份小小的悸動已經消失,可當我再聽到這首歌的述說,我還是想去,想去看那聖潔的雪山,湖水,想去感受藏族的風情,想要看看那些虔誠的人們... ?去之前,我參考過汽車之家的帖子,有一篇是勁炫進藏的,但他只到拉薩,目前還沒有勁炫到珠峰的帖子我要了這個心願,但是當時朋友們又要湊時間,又要湊車,這個沒辦法完成。所以就獨自單車走了今年9月,開著我的小勁炫,單車貴州都勻出發,經214轉318滇藏線,20余天,往返全程近8000公里,這車沒說的,一點不掉鏈子!綜合油耗6個左右,最高5200多米海拔一路狂奔,無人區,鹽鹹地,沙化路,搓板路,邊境戰備道等等都有經過,真的很感謝這個小勁炫,關於西藏有的人痴迷景色!有的人尋找信仰!有的人渴望極致!而我,有生之年,需前往之!關於西藏那些不曾領悟的震撼獻給勇敢的你。上圖了,還望版主給個鼓勵

總結

實現過程出現了UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa1 in position 351: invalid start byte的錯誤,這是在位元組轉換字串時出現的錯誤。解決方案:需要首先檢視網站的編碼格式即<meta charset="XXX">再來設定你的轉換格式,第二可以設定為decode("utf-8","ignore")#忽略嚴格模式

原始碼:點我  提取碼:y414