Ajax动态页面爬取的一个小练习

#以知乎为例模拟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)

猜你喜欢

转载自blog.csdn.net/wg5foc08/article/details/89422073