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  

猜你喜欢

转载自blog.csdn.net/weixin_36605200/article/details/85019829
今日推荐