0%

python爬虫实例之爬取36kr的新闻

爬什么

把36kr的新闻爬取到本地并保存为json格式。

怎么做

  • 获取url
  • 发送请求,获取响应
  • 提取数据
  • 保存数据

获取url

观察可知,目标数据所在url。
image.png
image.png

发送请求,获取响应

最基本的,用requests库发送请求即可。

提取数据

这里需要注意,使用正则提取目标数据之后,这个目标数据格式并不是标准的json格式,我们得调整一下(用re.sub方法去除多余的字符串),把它改成标准格式。
image.png

代码

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] #这里注意,正则之后返回的数据类型是列表,要转换成str类型继续使用正则
json_str =re.sub("window.initialState=","",json_str) #这个正则就是在去除多余的字符串
# print(json_str)
json_str = json.loads(json_str) #读取json数据
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)) #以格式化写入json数据。为了输出好看的格式,依然是先json.loads,再json.dumps,关键就是要用json.dumps的格式化方法

def run(self):
#1. 获取url
#2. 发送请求,获取响应
html_str = self.parse(self.url,self.headers)
#3. 提取数据
json_str = self.get_content(html_str)
#4. 保存数据
self.save_content(json_str)

if __name__ == '__main__':
my_kr = kr()
my_kr.run()

总结

为了输出好看的json格式文件,就要用json.dumps方法。使用这个方法,就得兜圈子,先把json转换为python数据类型,再把python数据类型转换为格式化的json字符串,写入文件并保存。

-------------本文结束感谢您的阅读-------------