Python爬虫学习-简单爬取网页数据

news2024/11/26 10:27:50

疫情宅家无事,就随便写一些随笔吧QwQ…

  这是一篇介绍如何用Python实现简单爬取网页数据并导入MySQL中的数据库的文章。主要用到BeautifulSoup requests 和 pymysql。

  以网页https://jbk.39.net/mxyy/jbzs/为例,假设我们要爬取的部分数据如下图所示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/048e76ad710242a5b7737714b0f11f1b.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXz

一、准备工作

  1.导入BeautifulSoup和requests库:

from bs4 import BeautifulSoup
import requests

  2.要想获得网页html内容,我们首先需要用requests库的.get()方法向该网页的服务器构造并发送一个请求。requests.get()方法需要传递两个参数,一个是网页的url,在这里显然是https://jbk.39.net/mxyy/jbzs/;另一个参数是浏览器的header。查看方法如下:
  点击进入任意一个网页页面,按F12进入开发者模式,点击Network再刷新网页。在Network下的Name中任意点击一个资源,在右侧的Headers版块中下拉到最后,可以看见Request Headers参数列表最后有一个user-agent,其内容就是我们要找的浏览器headers参数值。
在这里插入图片描述
  有了url和headers我们就可以利用requests.get()向服务器发送请求了:

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36'}
url = "https://jbk.39.net/mxyy/jbzs/"
r = requests.get(url, headers = headers)

  使用requests.get()方法会先构造一个向服务器请求资源的url对象然后从服务器返回一个包含服务器资源的Response对象,其中包含从服务器返回的所有相关资源(自然也包括我们所需的html)。
  获取网页的html内容:

html = r.content.decode('utf-8', 'ignore')

  解释:这里r.content返回“Content of the response, in bytes.”即返回HTTP响应内容(Response)的字节形式。因此我们需要使用.decode()方法来解码。这里ignore参数可要可不要,仅仅是为了忽略一些不重要的错误。
  有了html文本我们就可以把bs拿出来溜了:

my_page = BeautifulSoup(html, 'lxml')

  其实这里得到的my_page和html内容几乎一致,那么为什么还要用bs再次解析html呢?答:Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(Parse Tree)。 它提供简单又常用的导航(Navigating),搜索以及修改剖析树的操作,可以大大节省你的编程时间。也就是说,我们爬取数据需要用到的一些定位方法只有经由bs解析后返回的内容才能使用,单纯的html文本是不具备这样的方便快捷的方法的。

二、开始爬取数据

  在这里我们用到的方法主要是find | find_all | findAll | get_text() | text。
  1.find_all方法:
在这里插入图片描述  功能是查找该页面元素的所有子元素并且将寻找到的符合查找结果的子元素以列表的形式返回。
  2.find方法:
  与find_all差不多,但是只返回第一个与查找条件匹配的子元素,且仅返回文本,不以列表形式返回。
  3.get_text()和.text方法:
  用来提取标签中的文本信息。
  ps:get_text()和.text方法的区别:
  beautifulsoup中,对外接口,没有提供text这个属性,只有string这个属性值;beautifulsoup内部才有text这个属性,只供内部使用 –> 如果你想要用text值,应该调用对应的get_text();而你之所有能够直接用soup.text而没报错,应该是和python的class的property没有变成private有关系 –>导致你外部也可以访问到这个,本身是只供内部使用的属性值。
  4.具体实现示例:

for tag in my_page.find_all('div', class_='list_left'):
    sub_tag = tag.find('ul',class_="disease_basic") 
    my_span = sub_tag.findAll('span')
    #my_span可以认为是一个list
    is_yibao = my_span[1].text 
    othername = my_span[3].text 
    fbbw = my_span[5].text
    is_infect = my_span[7].text 
    dfrq = my_span[9].text 
    my_a = sub_tag.findAll('a')
    fbbw = my_a[0].text
    #注:也可用.contents[0]或者.get_text()

  用以实现爬取“是否属于医保”等条目冒号后面的内容。
在这里插入图片描述
  如何查找find_all()参数值?
  选中需要查找的内容并右键单击,选择“检查”,进入开发者模式,可看到相关内容的html代码如下图所示:
在这里插入图片描述
  可见,我们想爬的内容首先在一个class属性为“list_left”的div标签内—>在该div标签内又可发现想爬的内容在class属性为“disease_basic”的列表元素ul标签内—>在ul标签内可以发现我们想要的内容就分别藏在几个span标签内。

三、完整代码

# coding = utf-8
from bs4 import BeautifulSoup
import requests
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36'}
url = "https://jbk.39.net/mxyy/jbzs/"
r = requests.get(url, headers = headers)
html = r.content.decode('utf-8', 'ignore')
my_page = BeautifulSoup(html, 'lxml')

for tag in my_page.find_all('div', class_='disease'):   
    disease = tag.find('h1').get_text()
    disease_name = disease

for tag in my_page.find_all('p', class_='introduction'):
    introduction = tag.get_text()
    disease_introduction = introduction

for tag in my_page.find_all('div', class_='list_left'):
    sub_tag = tag.find('ul',class_="disease_basic") 
    my_span = sub_tag.findAll('span')
    #my_span is a list
    is_yibao = my_span[1].text    #是否医保
    othername = my_span[3].text   #别名
    fbbw = my_span[5].text        #发病部位
    is_infect = my_span[7].text   #传染性
    dfrq = my_span[9].text        #多发人群
    my_a = sub_tag.findAll('a')
    xgzz = my_a[2].text+' '+my_a[3].text+' '+my_a[4].text  #相关症状
    #ps: .contents[0] or .get_text() is also accepted

# Some tests:
# print(html)
# print(my_page)
# print(sub_tag)
# print(xgzz)
# print(my_span)
# print(my_span[1])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/621494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【板栗糖GIS】——如何下载哔哩哔哩的视频CC字幕为不带时间节点的纯文字

【板栗糖GIS】——如何下载哔哩哔哩的视频CC字幕为不带时间节点的纯文字 目录 1. 打开edge浏览器或谷歌浏览器 2. 安装油猴插件 3. 安装字幕插件 4. 打开哔哩哔哩视频播放页面,点击字幕 首先在想要下载之前需要先判定视频是否有云字幕,如果有才可以…

xxl-job详解

什么是xxl-job? ​ xxl-job是一个分布式的任务调度平台,其核心设计目标是:学习简单、开发迅速、轻量级、易扩展,现在已经开放源代码并接入多家公司的线上产品线,开箱即用。xxl是xxl-job的开发者大众点评的许雪里名称的…

SpringBoot+vue 实现监控视频rtsp播放(java+Nginx+ffmpeg+flv.js)

其实原理就是: 将监控通过FFMPEG,推送给Nginx,前端通过Nginx地址拉取视频,就可以播放了。 1:安装FFMPEG. 2:下载并且配置nginx. 3:使用java代码实现调用cmd或者linux窗口,并且运行操作FFMPEG的命令,进行监控视频rtsp格式的推送,推送给nginx. …

模板方法设计模式的学习和使用

1、模板方法设计模式的学习 当涉及到一系列具有相似行为的算法或操作时,模板方法设计模式是一种有效的设计模式。它允许你定义一个算法的骨架,同时将某些步骤的实现细节交给子类来实现。   模板方法模式基于以下两个核心原则: 抽象类定义模板方法骨架&#xff1a…

chatgpt赋能python:Python将一张图片分割成多张:从理论到实践

Python将一张图片分割成多张:从理论到实践 简介 随着Internet的爆炸式增长,图片已经成为了我们生活中不可或缺的一部分。具有高质量、高清晰度的图片可以提升网站的美观程度,帮助网站吸引更多的用户。但是,有时候大型的图片并不…

chatgpt赋能python:Python并不是一门简单的编程语言

Python 并不是一门简单的编程语言 Python 是一门直观且易学的编程语言,这一点没有错,但是要说它是简单的,那其实是不准确的。Python 有着广泛的应用领域,包括人工智能、大数据分析、Web开发、自动化测试等。尽管初学者可以迅速上…

MySQL中BETWEEN AND(范围查询)

0 写在前面 MySQL 提供了 BETWEEN AND 关键字,用来判断字段的数值是否在指定范围内。 BETWEEN AND 需要两个参数,即范围的起始值和终止值。如果字段值在指定的范围内,则这些记录被返回。如果不在指定范围内,则不会被返回。 最近…

JS 装饰器

JS 装饰器 JavaScript 装饰器是一种以 符号开头的特殊语法,放在目标代码的前面用于包装或扩展代码功能。JavaScript 的装饰器语法目前仍处于提案阶段,现阶段使用的话需要通过 bable 等方式进行编译之后,才能在浏览器正常运行。装饰器分为两…

chatgpt赋能python:Python将空值替换成0

Python 将空值替换成 0 在数据分析和处理过程中,清洗数据往往是非常重要的一个环节。而在清洗数据过程中,经常会遇到空值(Missing Values)的问题。空值是指在数据集中出现的缺失值,它可能是由于数据输入错误、数据采集…

chatgpt赋能python:Python定义数据框:介绍和基础操作

Python定义数据框:介绍和基础操作 数据框是一种非常方便的数据结构,用于在Python中存储和处理表格数据。数据框可以看作是围绕Series对象构建的2D数据结构,Series是一种存储单个列的一维标记数组。在本文中,我们将介绍如何使用Py…

基于树莓派4B的车牌号识别

目录 0. 前言1. Raspbian系统烧录2. 更换清华源1. 查看树莓派系统版本2. 更换清华国内源3. Raspi镜像修改4. 系统源更新5. 错误排查 3. opencv安装4. 安装 hyperlprpip安装编译安装 5. 验证项目可行性 0. 前言 基于树莓派4B的车牌号识别系统 操作系统:Raspbian PC…

QT实例2(QTableWidget表格中增删数据)

案例介绍 本案例仅简单介绍QTableWidget部分使用方法,如在表格中插入或删除一行数据以及清空表格数据等。在添加数据时,设置了条件判断如正则表达式,若用户输入的数据不合法,则添加失败并提示用户错误的地方,便于用户…

IPsec的NAT穿越详解

问题场景 左边的支部,它的防火墙上联路由器,由于防火墙内部的接口使用的是私网地址,这就导致其无无法在公网上与对端防火墙进行IPsec的隧道建立 。所以必须在AR5上面不是NAT地址转换,由于一般使用的是NAPT,isakmp协议因…

ChatGPT评测

总结:ChatGPT很强大,用作学术方面的问答或者软件行业的辅助工具是有一定的作用,但是有些回答设置了限制,并且中文回答方面总是回答一半,需要一直让他继续说,篇幅不是很长,但是往往能说道精髓&am…

最新加装ChatGPT的New Bing申请流程(含出错解决办法)

两天获得New Bing测试资格流程记录 前言一、Microsoft Edge Dev浏览器下载二、Microsoft账号注册与登陆三、浏览器插件下载与添加四、加入候补名单五、写封信给Bing团队 前言 2023.03.08,下午收到了Microsoft Bing公司的邮件,提示测试资格申请成功&…

Qt Xlsx的基本使用

前言 在很多时候 ,我们需要将数据导出,之前我是将数据表导出为CSV格式,CSV文件虽然可以用Excel打开,但相对于真正的Xlsx文件,还是有许多不足的。偶然之间,发现了QtXlsx这个第三方库。 1、QtXlsx官网对QtX…

makefile工具的使用,编写一个或多个文件!(简单易上手)

一、make 和 makefile 是什么 1. make 是一个 命令。 2. makefile 是一个 文件,可以自动化的构建项目。 3. 编写 makefile 需要: (1)依赖关系 (2)依赖方法 二、什么是依赖关系、什么是依赖方法 下面我简单…

【Java】Java核心要点总结:60

文章目录 1. 乐观锁一定就是好的吗2. Synchronized和ReentrantLock有什么异同3. ReentrantLock是如何实现可重入性的4. 和Synchronized相比,可以重入锁ReentrantLock实现原理有什么不同5. AQS框架 1. 乐观锁一定就是好的吗 乐观锁并不一定好,它有自己的适…

chatgpt赋能python:Python实现将一张图片贴到另一张图片上

Python实现将一张图片贴到另一张图片上 在图像处理中,往往需要将多张图片合成一张图片。这里介绍使用Python实现将一张图片贴到另一张图片上的方法。 准备工作 在实现之前,我们需要安装Python的图像处理库Pillow和numpy。 可以通过pip进行安装&#…

创建一个SpringBoot项目

Spring的诞生是为了简化JAVA程序的开发的 快速开发Spring而诞生的 SpringBoot为了快速开发Spring而诞生的一个框架 1)什么是SpringBoot?为什么要学它?(重要) Spring是包含了众多工具方法的IOC容器 SpringBoot就是Spring框架的脚手架,它的存在就是为了快…