爬什么
把36kr的新闻爬取到本地并保存为json格式。
怎么做
- 获取url
- 发送请求,获取响应
- 提取数据
- 保存数据
获取url
观察可知,目标数据所在url。


发送请求,获取响应
最基本的,用requests库发送请求即可。
提取数据
这里需要注意,使用正则提取目标数据之后,这个目标数据格式并不是标准的json格式,我们得调整一下(用re.sub
方法去除多余的字符串),把它改成标准格式。

代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| import requests import re import json
class kr: def __init__(self): self.url = "https://36kr.com/" self.headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"}
def parse(self,url,headers): response = requests.get(url,headers=headers) return response.content.decode()
def get_content(self,html_str): json_str = re.findall("<script>(.+?)</script>",html_str,re.S)[0] json_str =re.sub("window.initialState=","",json_str) json_str = json.loads(json_str) return json_str
def save_content(self,json_str): with open("36kr.json","w",encoding="utf8") as f: f.write(json.dumps(json_str,ensure_ascii=False,indent=2))
def run(self): html_str = self.parse(self.url,self.headers) json_str = self.get_content(html_str) self.save_content(json_str)
if __name__ == '__main__': my_kr = kr() my_kr.run()
|
总结
为了输出好看的json格式文件,就要用json.dumps
方法。使用这个方法,就得兜圈子,先把json转换为python数据类型,再把python数据类型转换为格式化的json字符串,写入文件并保存。