爬虫抓取网页数据(如何用Python实现简单爬取网页数据并导入MySQL中的数据库文章 )
优采云 发布时间: 2022-03-01 21:13爬虫抓取网页数据(如何用Python实现简单爬取网页数据并导入MySQL中的数据库文章
)
疫情期间在家无事可做,随便写点小品。QQ...
这是一个文章,介绍了如何使用Python简单地抓取网页数据并将其导入MySQL中的数据库。主要使用 BeautifulSoup requests 和 pymysql。
以一个网页为例,假设我们要爬取的一些数据如下图所示:
方法来构造并向网页的服务器发送请求。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])