爬虫抓取网页数据(如何用Python实现简单爬取网页数据并导入MySQL中的数据库文章 )

优采云 发布时间: 2022-03-01 21:13

  爬虫抓取网页数据(如何用Python实现简单爬取网页数据并导入MySQL中的数据库文章

)

  疫情期间在家无事可做,随便写点小品。QQ...

  这是一个文章,介绍了如何使用Python简单地抓取网页数据并将其导入MySQL中的数据库。主要使用 BeautifulSoup requests 和 pymysql。

  以一个网页为例,假设我们要爬取的一些数据如下图所示:

  ![在这里插入图片描述](https://img-blog.csdnimg.cn/048e76ad710242a5b7737714b0f11f1b.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXz

  一、准备

  1.导入 BeautifulSoup 并请求库:

  from bs4 import BeautifulSoup

import requests

  2.要获取网页的html内容,我们首先需要使用requests库的.get()方法来构造并向网页的服务器发送请求。requests.get() 方法需要传递两个参数,一个是网页的url,很明显就是在这里;另一个参数是浏览器的标题。检查如下:

  点击进入任意网页,按F12进入开发者模式,点击网络刷新网页。单击网络下名称中的任何资源,然后在右侧的标题部分中下拉到末尾。可以看到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 返回“响应的内容,以字节为单位”。即返回HTTP响应内容(Response)的字节形式。所以我们需要使用 .decode() 方法来解码。ignore 参数在这里是可选的,只是为了忽略一些不重要的错误。

  有了html文本,我们可以取出bs和slip:

  my_page = BeautifulSoup(html, 'lxml')

  其实这里得到的my_page和html内容几乎是一样的,那何必再用bs来解析html呢?A:Beautiful Soup 是一个用 Python 编写的 HTML/XML 解析器,可以很好地处理不规则的标签并生成 Parse Tree。它提供了简单通用的导航(Navigating)、搜索和修改解析树的操作,可以大大节省你的编程时间。也就是说,我们需要爬取数据的一些定位方式,只能在bs解析返回的内容后才能使用。简单的html文本没有这么方便快捷的方法。

  二、开始爬取数据

  我们这里使用的方法主要是find | 查找全部 | 查找全部 | 获取文本() | 文本。

  1.find_all 方法:

  

  作用是查找页面元素的所有子元素,并将找到的与搜索结果匹配的子元素以列表的形式返回。

  2.查找方法:

  与 find_all 类似,但只返回匹配搜索条件的第一个子元素,并且只返回文本,而不是列表。

  3.get_text() 和 .text 方法:

  用于从标签中提取文本信息。

  ps:get_text() 和 .text 方法的区别:

  在beautifulsoup中,对外接口不提供text属性,只提供string属性值;beautifulsoup 里面有 text 属性,仅供内部使用 --> 如果要使用 text 值,应该调用对应的 get_text(); 而你所有可以直接使用soup.text而不报错的,应该和python的类的属性没有变成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() 参数值?

  选择要查找的内容右键,选择“Inspect”,进入开发者模式,可以看到相关内容的html代码如下图:

  

  可以看出,我们要爬取的内容首先在一个class属性为“list_left”的div标签中——>在div标签中,我们可以发现我们要爬取的内容在list元素的ul标签中class属性为“disease_basic” --> 在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])

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线