ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Ajax分析与爬取实战

2022-02-01 13:00:40  阅读:122  来源: 互联网

标签:实战 分析 varchar get db Ajax result 255 页面


爬取目标

一个示例网站,其链接为:https://spa1.scrape.center/ ,改示例网站的数据请求是通过Ajax完成的,页面内容是通过JavaScript渲染出来的,页面加载如下图所示:

分析步骤

  • 分析页面数据的加载逻辑
  • 用requests实现Ajax数据的爬取
  • 将每部电影的数据分别保存到MySQL数据库中

页面分析

如果我们直接通过requests.get(url)来获取页面,结果如下,可以发现返回内容并非是浏览器渲染的源码,说明我们看到的整个页面都是由JavaScript和CSS文件渲染得到的,浏览器执行了HTML引用的JavaScript文件,JavaScript通过调用一些数据加载和页面渲染方法,才最终呈现了完整页面。

所以,打开浏览器开发者模式,点击网络模块-XHR。重新加载页面,切换下一页时,可以发现浏览器发送了一些请求,查看相应内容,就是页面的内容数据

代码实例

# -*- UTF-8 -*-
"""
@File:spa1_179.py
@Description:
@Author:echohye
@Date:2022/01/31 20:08
"""

import json
import pymysql
import requests

urls = [
    f'https://spa1.scrape.center/api/movie/?limit=10&offset={page * 10}'
    for page in range(10)
]

# 获取url对应源码
def craw(url):
    r = requests.get(url)
    return r.text


# 解析源码
def parse(html):
    obj = json.loads(html)['results']
    return obj

# 保存数据
def save_data():
    # 'id': 1,
    # 'name': '霸王别姬',
    # 'alias': 'Farewell My Concubine',
    # 'cover': 'https://p0.meituan.net/movie/ce4da3e03e655b5b88ed31b5cd7896cf62472.jpg@464w_644h_1e_1c',
    # 'categories': ['剧情', '爱情'],
    # 'published_at': '1993-07-26',
    # 'minute': 171,
    # 'score': 9.5,
    # 'regions': ['中国内地', '中国香港']}
    db = pymysql.Connect(host='localhost', user='root', password='zhy123', port=3306, db='spiders')
    cursor = db.cursor()
    table_sql = "create table if not exists ajax_p179(id int not null,name varchar(255) not null,alias varchar(255),cover varchar(255)" \
                ",categories varchar(255), published_at varchar(255),minute varchar(255),score double,regions varchar(255))"
    cursor.execute(table_sql)
    for url in urls:
        try:
            for result in parse(craw(url)):
                sql = "insert into ajax_p179(id,name,alias,cover,categories,published_at,minute,score,regions) " \
                      f"values({result.get('id')},\"{result.get('name')}\",\"{result.get('alias')}\",'{result.get('cover')}',\"{result.get('categories')}\"," \
                      f"'{result.get('published_at')}','{result.get('minute')}',{result.get('score')},\"{result.get('regions')}\")"
                cursor.execute(sql)
                db.commit()

        except Exception as e:
            print(e.args)
            db.rollback()
        print("successful")
    db.close()


if __name__ == '__main__':
    save_data()

标签:实战,分析,varchar,get,db,Ajax,result,255,页面
来源: https://www.cnblogs.com/echohye/p/15859005.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有