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

python爬虫学习45

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

python爬虫学习45

python爬虫学习45 Ajax数据爬取 3.初步探索

首先我们使用requests库来实际操作一下

# https://spa1.scrape.center/
import requests

url = 'https://spa1.scrape.center/'
html = requests.get(url).text
print(html)

运行结果:

这里我们虽然能够成功获得返回的html文本,但是对比实际网站我们就会发现事情远远没有那么简单:

对比网站上的内容就会发现我们没有在返回的html中发现任何的电影信息。

对于以上情况,就说明该网页使用了JavaScript渲染的技术之后得到的。这个时候若要爬取页面的电影信息我们需要调用Ajax数据接口,以实现对动态渲染之后的页面的爬取。

这时我们首先要对页面进行分析:

再进行下一页操作之后,可以看到比较明显两个参数:limit与offset

查看每一个响应的preview选项卡,可以看到我们所需的信息就隐藏在这里!
就想捉迷藏一样,看到它的下一步,就是把他们抓住了。

import requests
import logging
# 调用logging库进行程序日志的打印输出,以便对爬虫进程的监督
# 设定追踪日志的等级为 info 并设定格式化输入的格式
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s : %(message)s')
# 构造一个待引用的格式化URL字符串
index_url = 'https://spa1.scrape.center/api/movie/?limit={limit}&offset={offset}'

# 定义一个爬取时的通用函数
def scrape_api(url):
    logging.info('爬取中 %s ...', url)
    try:
        response = requests.get(url)
        # 如果成功响应则返回json文本
        if response.status_code == 200:
            return response.json()
        logging.error('get invalid status code %s while scraping url: %s', response.status_code, url)
    except:
        logging.error('爬取url : %s 时出现错误!', url)

limit = 10
# 定义一个爬取时的控制页的函数:
def scrape_index(page):
    # 这里的limit与offset就是我们之前分析的两个字段,
    # limit 代表一页中的条数 offset 代表累计显示的条数。所以我们很容易得出两个字段在页码增加时的关系
    url = index_url.format(limit=limit, offset=limit*(page - 1))
    return scrape_api(url)

# 最后我们调用构造好的函数,进行爬取
# 我们会发现若想要获取一个电影的详细数据还需要知道她的id
# 构造一个能够依照id进行爬去的函数

default = 'https://spa1.scrape.center/api/movie/{id}'

def scarp_detail(id):
    url = default.format(id=id)
    return scrape_api(url)

total_page = 10
# 定义主函,使得所有的操作在主函数内执行
def main():
    for page in range(1, total_page):
        # 先获取一页的信息
        index_data = scrape_index(page)
        # 在对每一页的具体某一电影的详细信息进行爬去
        # 因为所有的电影被放在results字段中,所以使用get方法获取results字段
        for item in index_data.get('results'):
            id = item.get('id')
            movie_data = scarp_detail(id)
            logging.info('对于爬取的每一个电影 其详情信息如下:%s',movie_data)


if __name__ == "__main__":
    main()

运行结果:

至此我们通过requests请求成功获得了Ajax处理过的数据。
是不是非常有成就感!

下图为对于logging日志追踪信息的级别的分类,在上例中我们追踪的是info,也就是只有程序正常进行时被记录的日志:

今日结束,未完待续…

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/948265.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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