#以知乎为例模拟Ajax请求,爬取我关注的一个知乎专栏的动态
#进入关注的知乎专栏,右击检查在Network选项卡下选中Ajax的XHR过滤器,滑动页面加载新的内容,会发现在Name框下不断有articles选项出现
该articles选项即为刷新出的Ajax请求。分析参数信息,点击请求进入详情页面,这是一个GET请求类型。
#请求链接为https://www.zhihu.com/people/sgai/activities,爬取此专栏的动态消息
#动态链接共有四个参数limit,session_id,after_id,desktop.其中每次出现的Ajax请求只有参数after_id会改变,但是改变也是无规律的改变。故只爬取一个Ajax请求的内容,当作练习。
#点击Ajax请求,在Preview选项中可以查看请求的响应内容,请求的主要内容包含在data选项框中
#data下面有多个元素,元素下包含的是知乎的一些信息。选取其中的一些节点信息爬取。比如action_text,comment_count,actor,content,excerpt节点内容。
#每个新的Ajax请求链接https://www.zhihu.com/api/v4/members/sgai/activities?limit=7&session_id=1090949826551648256&after_id=1551863271&desktop=True
#爬取下来的内容为字典格式,故不能保存到文本文件中,将数据保存到数据库中
from urllib.parse import urlencode
from pyquery import PyQuery as pq
import requests
import json
import time
from pymongo import MongoClient
def get_page( ):
params = {
'limit': '7',
'session_id ': '1090949826551648256',
'after_id': 1547986974,
'desktop': 'True'
}
url = base_url + urlencode(params)
try:
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.json()
except requests.ConnectionError as e:
print('Error', e.args)
# 首先定义base_url来表示请求的URL的前半部分。接着构造参数字典,其中include,limit是固定参数,offset是可变参数
def parse_page(json):
if json:
items = json.get('data')
for index, item in enumerate(items):
target_item = item.get('target')
yield {
'action_text:': item.get('action_text'),
'comment_count': target_item.get('comment_count'),
'actor:': item.get('actor'),
'content:': target_item.get('content'),
'excerpt': target_item.get('excerpt')
}
def write_to_file(content):
with open('zhihu.txt', 'a', encoding='utf-8') as f:
f.write(json.dumps(content.values, ensure_ascii=False))
base_url = "https://www.zhihu.com/api/v4/members/sgai/activities?"
headers = {
'headers': 'www.zhihu.com',
'User-Agent': 'Mozilla/5.O (Macintosh;Intel Mac OS X 10_12_3) AppleWebKit/537.36(KHTML,like Gecko) Chrome/58.0.3029.110 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
}
client = MongoClient( ) #定义一个对象
db = client['zhihu']
collection = db['zhihu']
def save_to_mongo(result):
if collection.insert(result):
print('Saved to Mongo')
if __name__ == '__main__':
json = get_page( )
results = parse_page(json)
for result in results:
print(result)
save_to_mongo(result)