爬取汽车之家问答详情页数据
爬取步骤如下:
1.确定首页目标的url
2.发送请求,得到详情页的url
3.再次发送请求,获取响应得到详情页的数据
4.解析详情页数据
5.保存数据
爬取方式:
通过首页url发送请求,得到详情页的url,再次发送请求,获取响应,从而得到详情页的目的数据。
本次案例目的:
介绍如何根据首页的url,爬取详情页对应的url以及详情页的数据。
一,找到主页的url:
二,在首页里找到问答的问题和详情页的url对应的xpath语法:
细心的朋友会发现,我们通过xpath找到的详情页的url并不是完整的,因此我们在对详情页发送请求时,需要对详情页的url进行手动拼接。
思路清晰之后,就开始上我们的代码:
注意:这是通过首页获取详情页的url,然后再次发送请求,在详情页中获取我们的目的数据。
import requests
from lxml import etree
import json
if __name__ == '__main__':
# 确认目标的url
url = 'https://wenda.autohome.com.cn/'
# 构造请求头参数
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36'
}
# 发送请求,获取响应
response = requests.get(url,headers=headers)
# 数据类型为html
str_data = response.text
# 将数据转化成py数据
py_data = etree.HTML(str_data)
# 提取数据
question_list = py_data.xpath('//h4/a/text()')
url_list = py_data.xpath('//h4/a/@href')
# 由于详情页的url都属不完整的,因此,需要通过手动拼接
answer_list = []
for i in url_list:
detail_url = 'https://wenda.autohome.com.cn'+i
detail_response = requests.get(detail_url,headers=headers)
# 数据类型为html
detail_data = detail_response.text
py_detail_data = etree.HTML(detail_data)
# 提取目标数据
answer = py_detail_data.xpath('//div[@class="ahe__area ahe__block ahe__text"]/p/text()')
# 获取回答为一个列表数据,因此需要将列表拼接起来
answer_ = ''.join(answer)
answer_list.append(answer_)
for i in range(len(question_list)):
dict_ = {}
dict_[question_list[i]] = answer_list[i]
# 将数据转换成json格式
json_data = json.dumps(dict_,ensure_ascii=False)+',\n'
# 保存到本地
with open('汽车之家问答.json','a',encoding='utf-8')as f:
f.write(json_data)