http://www.piyao.org.cn/zjsj.htm
爬取包括:
“文章发布时间
文章标题
链接”
特定时间:2019.1.1-2019.11.30
但是在请求网址的时候出现了问题

如图,因为不知道所要请求的网址是哪个,就全试了一下。发现:
当请求第一个url的时候,可以返回html源代码,但是里面没有列表元素
这样就无法找到自己需要的信息了。
所以我又请求了第二个网址,但得到的是
可以找到需要的信息,但在preview里的data里面,不知道如何提取出来。
在以上问题中
1.在爬虫请求中,我该使用哪个网址?
必须第二个,因为第一个网站得不到需要的数据。
2.如果是第二种的话,我现在已经得到了data数据,如何分离出来?
- 使用print(type(return_html)),可以看见得到的是一个json类型的字符串,现在需要将此字符串转换成json类型。使用json.loads()函数转换。
for url_ in url_li:
r_html = get_html(url_)
json_html = json.loads(r_html)
- 转换后再执行print(type(return_html))可以看见现在已经是dict了
- 然后调用字典取值相关的就可以拿到数据了
for item in range(14):
Title = rl_html['data']['list'][item]['Title']
date = rl_html['data']['list'][item]['PubTime']
T_url = rl_html['data']['list'][item]['LinkUrl']
k_words = rl_html['data']['list'][item]['keyword']
import csv
import requests
import json
def get_html(url_):
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) ……'
}
html = requests.get(url_, headers=headers)
html.encoding = 'utf-8'
return html.text
def get_info(rl_html):
rum_inf_list = []
for item in range(14):
Title = rl_html['data']['list'][item]['Title']
date = rl_html['data']['list'][item]['PubTime']
T_url = rl_html['data']['list'][item]['LinkUrl']
k_words = rl_html['data']['list'][item]['keyword']
rumour_dic = {}
rumour_dic['title'] = ''.join(Title)
rumour_dic['date'] = date
rumour_dic['url'] = T_url
rumour_dic['keywords'] = k_words
rum_inf_list.append(rumour_dic)
return rum_inf_list
def writeData(rumour_list):
with open('./Roumour.csv','w',encoding='utf-8',newline='') as f:
writer = csv.DictWriter(f,fieldnames=['title','date','url','keywords'])
writer.writeheader() # 写入表头
for each in rumour_list:
writer.writerow(each)
def main():
rumour_list = []
url_li = []
page = 1 # page<23即可
for page in range(1, 23):
url = 'http://da.wa.news.cn/nodeart/page?nid=11158867&pgnum={}&cnt=14'.format(page)
page += 1
url_li.append(url)
for url_ in url_li:
r_html = get_html(url_)
json_html = json.loads(r_html)
rumour_list += get_info(json_html)
print("正在爬取中……")
writeData(rumour_list)
print("爬取完成 ")
if __name__ == '__main__':
main()