一、参考文章
https://segmentfault.com/a/1190000016970787?utm_source=tag-newest
# coding=UTF-8
# @ File : Laoli.py
import requests # 通过 requests 模块发起 http 请求
import json
import urllib
import csv
# 请求的首部信息
headers = {
'user-agent': "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:67.0) Gecko/20100101 Firefox/67.0",
'accept': "application/json, text/plain, */*",
'accept-language': "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
'accept-encoding': "gzip, deflate, br",
'cookie': "zsxq_access_token=8C***************B;" # 这个zsxq_access_token每次扫码后的值不一样
}
# ***************************************************************************************************
#创建并写入csv文件
f = open('C:/Users/Queenie/Desktop/zsxq.csv', 'w') # 写入zsqx.csv,参见Python open() 函数
writer = csv.writer(f) # 参见csv文件读写(函数reader、writer;类DictReader、DictWriter)
writer.writerow(['created_time', 'ask_name', 'ask_content', 'comments'])
#定义爬取信息的函数主体
def get_info(url):
res = requests.get(url, headers=headers) # 利用requests对象的get方法,对url发起请求,得到Response对象res
json_data = json.loads(res.text) # 将返回的内容转换成json格式
datas = json_data['resp_data']['topics'] # 指定从 resp_data > topics 中获取数据
for data in datas:
if 'talk' in data.keys(): # 判断json中是否包含 talk 这个键
ask_name = data['talk']['owner']['name']
ask_content = data['talk']['text']
else:
ask_name = ''
ask_content = ''
if 'show_comments' in data.keys():
comments = data['show_comments']
else:
comments = ''
created_time = data['create_time']
writer.writerow([created_time, ask_name, ask_content])
# 截止到前面的代码,已经可以实现一个页面的爬取。下面的代码内容主要任务是实现“如何自动实现多页面爬取”
# 多页面的爬取是通过Network中Query String Parameters来实现的:这里提供两个参数,观察之后发现count是固定值,而end_time和网址最后的时间是一样的。
# 只不过在网页中用到了 urlencode的转化,这部分是新学习的知识。
# 在这个爬虫案例中,网页构造的核心逻辑是“上一组最后一个数据的创建时间刚好是下一组数据访问网址中的一个参数”,以此来构造循环抓取的网址
end_time = datas[19]['create_time']
url_encode = urllib.parse.quote(end_time) # urlencode,将网址中的文本转化
next_url = 'https://api.zsxq.com/v1.10/groups/5************4/topics?count=20&end_time=' + url_encode # 通过观察构造下一组数据的网址
get_info(next_url) # 这里比较巧,直接在函数内部再次调用函数,从而实现不断的自循环
if __name__ == '__main__':
url = 'https://api.zsxq.com/v1.10/groups/5***********4/topics?count=20'
get_info(url)
网友评论