第二章 动态网页抓取
动态网页:通过AJAX技术,在后台与服务器进行少量的数据交换就可以使网页实现异步更新,这意味着可以在不断重新加载整个网页的情况下对网页的某部分进行更新。一方面减轻了网页重复内容的下载,另一方面节省了流量
解析真实地址抓取
import requests
import json
link = "https://api-zero.livere.com/v1/comments"
headers ={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36"}
r=requests.get(link,headers=headers)
json_string = r.text #获取json的string
json_string = json_string[json_string.find("{"):-2]
#从第一个左大括号提取,最后的两个字符-括号和分号不取
json_data = json.loads(json_string) #加载字符串,读取字符串
comment_list = json_data["results"]["parents"] #字典嵌套,例[2][3],第2个元素中的第3个元素
for enchone in comment_list:
message = eachone["content"]
print(message)
使用json_string[json_string.find("{"):-2],提取字符串中符合json格式部分,然后使用json.loads 可以把字符串格式的响应体数据转化为json数据,利用json数据的结构,提取到评论的列表comment_list.最后通过一个for循环,提取其中的评论文本,并输出dayin
扩展
json.load 读取文件
json.loads 读取字符串
json.dump 将python转化为json格
使用for循环爬取多个页面的评论,对比两个页面的地址,有两个特别重要的变量,即offset和limit,limit代表的是每一页评论数量的最大值,offset代表的是第几页
so我们可以通过改变offset的值实现换页
import requests
import json
def single_page_comment(link):
headers ={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36"}
r=requests.get(link,headers=headers)
json_string = r.text #获取json的string
json_string = json_string[json_string.find("{"):-2]
#从第一个左大括号提取,最后的两个字符-括号和分号不取
json_data = json.loads(json_string) #加载字符串,读取字符串
comment_list = json_data["results"]["parents"] #字典嵌套,例[2][3],第2个元素中的第3个元素
for eachone in comment_list:
message = eachone["contebt"]
print(message)
for page in range(1,4):
link1 = "https://api-zero.livere.com/v1/comments&limit=10&offset="
link2 = "&repset=38179895656&repsetPath"
page_str = str(page)
link = link1 + page_str + link2
print(link)
single_page_comment(link)
```注:上述地址有问题,不可用
上述代码,single_page_comment(link)是之前爬取一个评论页面的代码,现在放入函数中,方便多次调取。