栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python3爬虫笔记之Ajax

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python3爬虫笔记之Ajax

目录
  • 什么是ajax
  • 基本原理
  • ajax分析方法
  • ajax分析与爬虫实战

原始页面不会存在某些数据,可能是通过ajax加载的,数据通过ajax统一加载后呈现出来,直接用requests库抓取原始html是不会包含任何数据的,需要分析网页向后台接口发送的ajax请求。

什么是ajax

利用javascrip保证页面不被刷新,链接不改变的情况下与服务器交换数据并更新部分网页内容的技术。
比如下滑查看更多就是ajax加载过程。

基本原理
var xmlhttp;
if (window.XMLHttpRequests) {
pass
} else {
xmlhttp=new.....
}
xmlhttp.onreadystatechange=function{}
xmlhttp.open()
xmlhttp.send()

新建的一个XMLHttpRequests对象xmlhttp,然后调用onreadystatechange属性设置监听,最后调用open和send方法向某个链接发送请求。这个这是请求的原理,还有解析内容和渲染,感兴趣可以自己去了解

ajax分析方法


ajax请求类型type是xhr,这就意味是ajax请求。

requests headers里面有个X-Requested-With就标记此请求时ajax请求,点击previev就能看到响应的内容

切换到response选项看也有信息

ajax分析与爬虫实战
import pymongo
import requests
import logging

logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s - %(levelname)s: %(message)s')


INDEX_URL = 'https://spa1.scrape.center/api/movie/?limit={limit}&offset={offset}'#把limit和offset预留出来占位符动态传入参数,构造完整列表页

MONGO_CONNECTION_STRING = 'mongodb://localhost:27017'
MONGO_DB_NAME = 'movies'
MONGO_COLLECTION_NAME = 'movies'

client = pymongo.MongoClient(MONGO_CONNECTION_STRING)
db = client['movies']
collection = db['movies']


def scrape_api(url):
    logging.info('scraping %s...', url)
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.json()
        logging.error('get invalid status code %s while scraping %s',
                      response.status_code, url)
    except requests.RequestException:
        logging.error('error occurred while scraping %s', url, exc_info=True)


LIMIT = 10


def scrape_index(page):
    url = INDEX_URL.format(limit=LIMIT, offset=LIMIT * (page - 1))
    return scrape_api(url)


DETAIL_URL = 'https://dynamic1.scrape.center/api/movie/{id}'


def scrape_detail(id):
    url = DETAIL_URL.format(id=id)
    return scrape_api(url)


TOTAL_PAGE = 10


def save_data(data):
    collection.update_one({
        'name': data.get('name')
    }, {
        '$set': data
    }, upsert=True)


def main():
    for page in range(1, TOTAL_PAGE + 1):
        index_data = scrape_index(page)
        for item in index_data.get('results'):
            id = item.get('id')
            detail_data = scrape_detail(id)
            logging.info('detail data %s', detail_data)
            save_data(detail_data)
            logging.info('data saved successfully')


if __name__ == '__main__':
    main()
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/960573.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号