python实现爬取网页将特定信息存入excel

2023-05-16

python爬虫爬取网页将特定信息存入excel

背景
1、最近遇到一个需要进行数据分析的项目,主要是将网页上需要的信息,进行归拢,分析。当信息量少的时候,采用复制粘贴-excel分析还比较快捷方便,当如果数据上升到几百甚至几千条时,一个一个的复制粘贴,就明显感觉效率低下,难以操作。
2、之前也一直听说过python爬虫,趁着这个机会正好来实验一波。笔者几年前曾学过python,有一定的基础。

需求分析:
1、目的:通过python爬虫,实现批量化抓取网页中的有效信息,然后将信息,一条一条的存储到excel中。最后通过用excel进行最后的数据统计分析。
2、功能需求
a,读取网页
b,抓取网页特定内容
c,将内容按顺序存储到excel中

功能实现
爬虫的本质是,编写程序,让程序模拟人操作浏览器进行网页访问。本文以豆瓣电影为例,实现爬取某类型影片的排名信息

网页分析

当打开豆瓣电影分类排行榜,选择动作片后,出现的页面如下。
在这里插入图片描述
当页面的进度条拖到最下面,会直接刷新出新的页面,而不是重新刷新整个页面,这用的就是阿贾克斯网页动态局部加载技术。
在这里插入图片描述
下面右键网页,选择检查,切换到Network选项,筛选出XHR选项

在这里插入图片描述
把进度条继续拖动到最下面,发现刷新出了,一个请求信息。
在这里插入图片描述
双击这个请求,可以看到Response里面是一个类似json格式的数据,里面信息刚好就是对应着页面中的电影信息
在这里插入图片描述
切换到Headers选项,仔细看下网页的请求接口,如果能找到这个请求接口,那么就可以python中request模块访问该接口,网页反馈的是类似json格式的数据,如果这一步走通了,接下来就好办了。那先来看下请求接口。
在这里插入图片描述
在这里插入图片描述
可以看到,请求的地址是https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=100&limit=20,请求的方式是GET。参数以后type,interval_id,action,start,limit。
通过对headers分析,发现,请求里面有5个参数,那这个参数都是什么含义呢?写python程序是需要对这些参数赋什么值呢?
其实爬虫我们要重点关注返回的数据,请求我们只要保证请求命令能正常得到反馈就行了。所以我们只需要找到这个请求中,哪些参数是变化的,然后分析出这个参数的含义,对于不变的参数,程序中就按照网页headers里面的填写即可。
要找到变化的参数,只需要往下拉进度条,看新的请求数据
在这里插入图片描述
在这里插入图片描述
可以看到,里面只有start变化了,start 80;limit 20 ; start100 ; limit 20 。是不是可以猜测,这个20就是每次刷新的影片数量?start就是要从排名第几的影片开始读取?
在这里插入图片描述
通过初步分析下网页,这个可能性极大,要验证也简单呀,还记得里面的请求是GET,那么可以用浏览器直接访问该接口验证一下。
start =1 limit=2,刷新出来了这个杀手不太冷和七武士两部影片
在这里插入图片描述
在这里插入图片描述
start =2 limit=3,刷新出来了七武士、切腹、蝙蝠侠:黑暗骑士三部影片。由此可以验证start为从排名第几的影片开始请求。limit为每次请求影片数量。如果我想抓取排名前300的影片,那只需要将start=1,limit=300即可。网页分析到这里就可以了,已经得到了我们想要的信息
1、接口:https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=2&limit=3
2、请求方式:GET
3、参数:type interval_id action start limit 前面三个是固定不变的

小结:
1、本部分,通过分析网页,发现豆瓣影片排名采用的是网页局部动态加载技术
2、在检查里,筛选出来了动态加载的请求接口,以及请求的反馈是类json格式(便于后期python解析),以及通过猜想和直接调用接口,找到start和limit两个参数含义

python代码编写

1、User_agent介绍
如果你是豆瓣网站的开发者,那你希望别人采用非正规的方式来批量抓取你网站里面的数据吗?稍微想一下,答案肯定是否定的。那么网站服务器怎么确定当前的访问是合法的呢?最基础的方式就是利用请求载体的身份识别信息User_agent来做,不同的浏览器都有不同的身份识别信息
如下是笔者谷歌浏览器的身份识别信息。那么为了防止写的程序求被服务器拒绝访问,在用request模块请求的时候要带上身份识别信息。
在这里插入图片描述
2、代码
先直接上代码,及excel数据


```python
#!/user/bin/env python
# -*- coding:utf-8 -*-

#UA:User-Agent(请求载体的身份标识)
#UA检测,网站检测到UA不是正常浏览器身份标识,则服务器端很有可能会拒绝该请求
#UA伪装,让爬虫对应的请求载体UA标识伪装成某一浏览器


#解析豆瓣电影
#页面局部刷新 XHR请求

import requests
import json
import xlwings as xw

# 指定url,发起请求,获取响应数据,存储
if  __name__ == "__main__":
    #UA:将对应的User_Agent封装到一个字典中
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
    }
    url= "https://movie.douban.com/j/chart/top_list"
    start_num = input("enter start num:")
    limit_num = input("enter limit num:")
    param = {
        'type': '5',
        'interval_id': '100:90',
        'action':'', 
        'start': start_num,
        'limit': limit_num,
    }
    #处理url携带的参数:封装到字典中
    response = requests.get(url=url, params=param,headers = headers)
    # print(response.text)
    # ps_name = json.loads(response.text).get('ps_name')
    # print('\r\n',ps_name)
    #确认服务器返回的json则可以使用json
    dic_obj = response.json()
    # json_name = json.loads(dic_obj)
    app=xw.App(visible=False,add_book=False)
    wb=app.books.add()
    sht = wb.sheets['Sheet1']

    sht.range('A1').value ='序号' 
    sht.range('B1').value ='排名' 
    sht.range('C1').value ='名称' 
    sht.range('D1').value ='评分' 
    sht.range('E1').value ='上映日期' 
    sht.range('F1').value ='国家' 

    i=1
    for dic_item in dic_obj:
        print('cnt:',i,'title ',dic_item['title'],'\r\n')
        sht.range('A'+str(i+1)).value =i 
        sht.range('B'+str(i+1)).value = dic_item['rank']
        sht.range('C'+str(i+1)).value = dic_item['title']
        sht.range('D'+str(i+1)).value = dic_item['rating'][0]
        sht.range('E'+str(i+1)).value = dic_item['release_date']
        sht.range('F'+str(i+1)).value = dic_item['regions'][0]
        i +=1
    wb.save('movie_rank.xlsx')
    wb.close()
    app.quit()

执行一下,程序已经在正确输出信息了
在这里插入图片描述

打开生成的excel,需要的信息已经生成,剩下的分析就看你的excel能力了
在这里插入图片描述
如果在完善下程序,分析页面后发现type是对应的电影类型,5:动作;11:剧情。可以把type全部试出来,然后放入字典里,实现指定抓取某一类型的电影。笔者完成的是动作电影的抓取。

代码分析

使用到的模块

requests
json
xlwings

requests是网络请求的库,xlwings是操作excel的库,可支持xlxs格式文件。

    #UA:将对应的User_Agent封装到一个字典中
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
    }
    url= "https://movie.douban.com/j/chart/top_list"
    start_num = input("enter start num:")
    limit_num = input("enter limit num:")
    param = {
        'type': '5',
        'interval_id': '100:90',
        'action':'', 
        'start': start_num,
        'limit': limit_num,
    }

这一部分是定义头,访问接口,以及参数,变化的参数采用终端输入。

    #处理url携带的参数:封装到字典中
    response = requests.get(url=url, params=param,headers = headers)

用get命令访问,有的网页采用的可能是post,需要与网页实际的请求方式保持一致。浏览器地址栏里只能实现get请求,post请求可以用postman等工具验证

    dic_obj = response.json()
    # json_name = json.loads(dic_obj)
    app=xw.App(visible=False,add_book=False)
    wb=app.books.add()
    sht = wb.sheets['Sheet1']

    sht.range('A1').value ='序号' 
    sht.range('B1').value ='排名' 
    sht.range('C1').value ='名称' 
    sht.range('D1').value ='评分' 
    sht.range('E1').value ='上映日期' 
    sht.range('F1').value ='国家' 

    i=1
    for dic_item in dic_obj:
        print('cnt:',i,'title ',dic_item['title'],'\r\n')
        sht.range('A'+str(i+1)).value =i 
        sht.range('B'+str(i+1)).value = dic_item['rank']
        sht.range('C'+str(i+1)).value = dic_item['title']
        sht.range('D'+str(i+1)).value = dic_item['rating'][0]
        sht.range('E'+str(i+1)).value = dic_item['release_date']
        sht.range('F'+str(i+1)).value = dic_item['regions'][0]
        i +=1
    wb.save('movie_rank.xlsx')
    wb.close()
    app.quit()

这一部分实现,读取返回的json格式数据,转换后的数据实际上是字典。
操作excel5部曲
1、建立APP
2、建立books
3、建立sheet页
4、数据写入
5、保存关闭

sht.range(‘A1’).value=‘序号’
表示向A1单元格写入序号,如果需要向B10写入,就将上面的A1改为B10,操作起来十分方便。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python实现爬取网页将特定信息存入excel 的相关文章

  • Hadoop源码分析——计算模型MapReduce

    MapReduce 是一个计算模型 xff0c 也是一个处理和生成超大数据集的算法模型的相关实现 用户首先创建一个Map函数处理一个基于key value pair的数据集合 xff0c 输出中间的基于 key value pair 的数据
  • 从SDLC到DevSecOps的转变

    OSSTMM 根据开源安全测试方法手册OSSTMM Open Source Security Testing Methodology Manual 的表述 安全测试包括但不限于以下几种做法 漏洞扫描 安全扫描 渗透测试 风险评估 安全审核
  • 大数据014——Storm 简介及入门案例

    分布式实时数据处理框架 Storm 1 Storm简介与核心概念 1 1 Storm 简介 全称为 Apache Storm xff0c 是一个分布式实时大数据处理系统 它是一个流数据框架 xff0c 具有最高的获取率 它比较简单 xff0
  • Hive与HBase整合详解

    参考之前小节的大数据010 Hive与大数据012 HBase成功搭建Hive和HBase的环境 xff0c 并进行了相应的测试 xff0c 并且在大数据011 Sqoop中实现Hive HBase与MySQL之间的相互转换 xff1b 本
  • 大数据015——Elasticsearch基础

    1 Elasticsearch 简介 Elasticsearch是一个基于Lucene的实时的分布式搜索和分析 引擎 设计用于云计算中 xff0c 能够达到实时搜索 xff0c 稳定 xff0c 可靠 xff0c 快速 xff0c 安装使用
  • 大数据015——Elasticsearch深入

    1 Elasticsearch 核心概念 1 1 cluster 代表一个集群 xff0c 集群中有多个节点 xff0c 其中有一个为主节点 xff0c 这个主节点是可以通过选举产生的 xff0c 主从节点是对于集群内部来说的 es的一个重
  • 大数据014——Storm 集群及入门案例

    分布式实时数据处理框架 Storm 1 Storm 集群 1 1 Storm 版本变更 版本编写语言重要特性HA 高可用0 9 xjava 43 clojule改进与Kafka HDFS HBase的集成不支持 xff0c storm集群只
  • 大数据016——Kafka

    1 Kafka 简介 Kafka 是一个高吞吐量 低延迟分布式的消息队列系统 kafka 每秒可以处理几十万条消息 xff0c 它的延迟最低只有几毫秒 Kafka 也是一个高度可扩展的消息系统 xff0c 它在LinkedIn 的中央数据管
  • 大数据017——Scala基础

    Scala 是一门以 java 虚拟机 xff08 JVM xff09 为目标运行环境并将面向对象和函数式编程语言的最佳特性结合在一起的编程语言 你可以使用Scala 编写出更加精简的程序 xff0c 同时充分利用并发的威力 由于scala
  • 大数据017——Scala进阶

    Scala 基础语法 第二阶段 1 类和对象 1 1 类 1 xff09 简单类和无参方法 如下定义Scala类最简单形式 xff1a class Counter private var value 61 0 必须初始换字段 def inc
  • 大数据018——Spark(一)

    1 Spark 数据分析简介 1 1 Spark 是什么 Spark 是一个用来实现快速而通用的集群计算的平台 在速度方面 xff0c Spark 扩展了广泛使用的 MapReduce 计算模型 xff0c 而且高效地支持更多计算模式 xf
  • ROS 订阅RealsenseD435图像与opencv保存32位深度图像

    一 xff0c 通过ros订阅realsense图像 int main int argc char argv ros init argc argv 34 image listener 34 ros NodeHandle nh cv name
  • 测试左移和右移:不是左右逢源而是左右突击

    持续测试是在软件交付生命周期过程中 xff0c 以防控业务风险为目的 xff0c 将每一个业务交付阶段都辅以测试活动进行质量保障 xff0c 并尽最大可能自动化 xff0c 通过测试结果不断的反馈给制品过程的测试实践活动 随着持续测试实践的
  • 虚拟机ubuntu上安装make和cmake

    可先更新下apt xff1a sudo apt get update 首先安装make xff1a sudo apt get install ubuntu make sudo apt get install make sudo apt ge
  • ros学习笔记(十):树莓派 Ubuntu mate 16.04 开启vncserver 远程桌面+自启动+分辨率修改

    树莓派 Ubuntu mate 16 04 开启vncserver 远程桌面 43 自启动 43 分辨率修改 一 环境 1 树莓派3b 43 Ubuntu 16 04 mate 2 我是在win10 安装的 vncview 软件进行远程桌面
  • 梯度、散度、旋度的关系

    转自 百度文库https wenku baidu com view 681228626137ee06eff918c4 html 知乎上一篇不错的文章 https www zhihu com question 24591127 麦克斯韦方程组
  • 【瓣芽·Banya】React Native 构建的仿豆瓣应用

    今天介绍一个用 React Native 创建的应用 xff0c 集合了豆瓣电影 xff0c 图书等信息展示功能的 app github 地址 瓣芽 Banya 项目使用了react navigation 做路由 redux 做部分状态管理
  • CSS - position

    在 CSS 中 xff0c position 是实现元素定位的一种重要方式 使用定位的元素层叠级别比浮动会更高 xff0c 采用定位来控制元素位置会更加容易 一般我们使用定位 xff0c 是通过使用定位模式和边偏移量来确定元素位置的 定位模
  • React Native 选择器组件 / react-native-slidepicker

    react native slidepicker 一个纯 JavaScript 实现的的 React Native 组件 xff0c 用于如地址 xff0c 时间等分类数据选择的场景 github https github com lexg
  • 函数式组件 ref 的解决方案

    对于 React 中需要强制修改子组件的情况 xff0c React 提供了 Refs 这种解决办法 xff0c 使得我们可以操作底层 DOM 元素或者自定的 class 组件实例 除此之外 xff0c 文档 xff08 v17 0 1 x

随机推荐