文章目录
最近毕业论文需要数据,可惜网站只提供了数据表格,没法直接下载,所以趁此机会学习下爬虫。爬虫是什么?简单讲就是自动化程序,通过模拟用户访问网页的行为,抓取并解析互联网上的信息,然后保存到本地。这里提到了两个动作:(1)抓取互联网上的信息(2)解析抓取到的信息。那什么是互联网上的信息呢?就是html,我们看到的网页背后实际上都是html代码,而这些代码中间就夹杂这可能有用的信息,我们抓取互联网上的信息就相当于是去获取相应的html代码,去解析抓取到的信息简单讲就是对html代码的内容进行筛选,过滤得到自己想要的信息。听起来很复杂,实则不然,因为有现成的软件包可以使用。python爬虫常用软件报如下:
- requests:伪装用户访问网页,获取网页的html。
- bs4:用来对html内容进行解析的库。
- pandas库:pandas库的read_html函数可以把一个html中的所有表格读取成dataframe放到一个列表中。
- notepad++:推荐下载这个文本编辑器,因为它会对html的内容自动按规则缩进,使得html易读,方便我们设计筛选策略,从html中解析出我们需要的信息。
ok,接下来咱就先从requests库和bs4库的用法讲起。
requests库和bs4库的常见用法
使用requests库获得url指定网页的html
首先,我们得打开url指定网页,然后右键点击检查,选择网络选项,在headers中查找到user-agent等信息(一般headers只需要设置user-agent就行了,但如果请求失败,可以尝试添加其它信息),然后再把它传递给requests的get或post函数,让程序伪装成真人获取网页的html。可为什么要做这一步呢?(原理参考)简单说网页是希望真人访问而不欢迎程序访问的,如果不这么干有些网页是会对你的自动化程序进行拦截的,就获取不到它的html了。具体的调用语法以及返回对象的相应属性如下图。

注意:requests库只能获取网页的静态内容,而有些网页使用JavaScript来动态加载内容,这就会导致requests得到的html和实际的html是不一致(如实战01)。有两个解决措施:(1)就继续使用requests得到的html,如果当中还是包含所需信息。(2)使用selenium库获取html。
使用bs4库的Beautifulsoup类对html内容进行解析(筛选)
要对html进行解析,首先就得了解下html的基础知识。html全称是Hyper Text Marked Language,它通过不同标签的组合实现文本、图像、表单等内容的组织与展示。常见的标签包括:(1)html标签,tml标签就是根标签,包裹整个页面内容。(2)body标签,body标签里放的就是在页面上可以看到的内容;(3)div标签,div标签是区块,爬虫经常先定位到区块,再在区块基础上做进一步定位。标签通常是成对出现的,开头的标签叫开始标签,结尾的标签叫结束标签。并且html里面的标签很多都是嵌套结构(这也是推荐下载notepad++的原因,不然html内容太乱了,根本看不清楚,更别提设计筛选方法了)。放在开始和结束标签中间的内容叫做链接文字,放在开始标签内的内容叫做标签属性。
补充:常见html标记的含义

ok,html的基础目前知道这么多是够用了。然后我们就可以对html进行解析了。首先,可以肯定的是requests返回对象的text属性放的就是指定url的html,但是它是一个字符串,我们要对这个字符串的内容直接进行筛选是非常困难的,简单的办法就是把它传递给Beautifulsoup,得到一个Beautifulsoup的实例。那为什么这样做呢?因为Beautifulsoup类有非常强大的find和find_all方法,可以快速的筛选出html类中指定标签以及嵌套在其标签内部的标签所包含的内容,并且可以方便的访问标签的相关信息。具体调用语法见上图。
实战
01 爬取个人博客上所有的文章名及其网址
分析
待爬网页的html上就包含了所需的全部信息,使用requests库获取网页的html,然后用bs4库筛选出想要的数据。
代码
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 26 18:46:21 2025
@author: syaunsheng
"""
import requests
from bs4 import BeautifulSoup
# 我博客主页的url
url_root = "https://blog.youkuaiyun.com/fighterDMU"
# 打开浏览器查看user-agent和cookie设置headers,伪装成真人访问网页源代码
headers = {
'User-Agent':"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Mobile Safari/537.36 Edg/133.0.0.0"
}
r = requests.get(url_root,headers=headers)
if r.status_code != 200:
raise Exception("请求失败")
with open(r'.\html.txt','w') as f:
f.write(r.text) # 由于csdn使用JavaScript动态加载内容,而requests只能获取网页的静态内容,导致requests得到的内容和网页源代码不一致,所以先把requests读取到的内容写入文件,再看看有什么办法把需要的信息读出来。
# 发现所需信息放在<ul class="colu_author_c">这个标签中,把这种标签之内的内容先筛选出来,然后一层一层筛选出所需内容
soup = BeautifulSoup(r.text,'html.parser')
ul_tags = soup.find('ul',class_='colu_author_c')
div_tags = ul_tags.find_all('div',class_='colu_author_c_listName')
for div_tag in div_tags:
h4_tags = div_tag.find('h4')
a_tags = h4_tags.find('a')
print('文章:《{}》 地址:{}'.format(a_tags.get_text(),a_tags['href']))
02 爬取城市过去几年的天气情况
分析
以绵阳市的历史天气为例,从https://tianqi.2345.com/wea_history/71996.htm 这个网站上获取过去几年的天气情况,并写入到excel表格中。注意到该网站使用了ajax技术,即通过在后台发送异步 HTTP 请求并接收响应,使得用户能够在不刷新整个页面的情况下(就是说你切换年月后观察不到url的变化)获取更新后的数据。这时我们就得使用浏览器的检查功能抓包该网页的请求url和查询字符串。通过设置params函数实现对网页的请求。
代码
# -*- coding: utf-8 -*-
"""
Created on Thu Feb 27 14:45:44 2025
@author: syaunsheng
"""
import requests
import pandas as pd
from io import StringIO
from bs4 import BeautifulSoup
url = "https://tianqi.2345.com/Pc/GetHistory" # 待爬取网站的url链接
headers = {
'user-agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 Edg/133.0.0.0",
'referer':'https://tianqi.2345.com/wea_history/56196.htm'
} # 伪装成真人进行访问
def get_weather(year=2025,month=2):
"""获取指定年,月的天气"""
params = {
'areaInfo[areaId]': 71996,
'areaInfo[areaType]': 2,
'date[year]': year,
'date[month]': month
} # 设置url的查询字符串参数
r = requests.get(url,headers=headers,params=params)
if r.status_code != 200:
raise Exception("抓取失败")
s = StringIO()
s.write(r.json()['data'])
s.seek(0)
return pd.read_html(s)[0]
df_lst = [] # 存放各月的dataframe
for year in range(2023,2025):
for month in range(1,13):
df = get_weather(year,month)
df_lst.append(df)
pd.concat(df_lst,ignore_index=True).to_excel('.\绵阳市天气数据.xlsx')
附:浏览器检查功能的使用
(1) 查看headers,设置相关参数。

(2) 查看浏览器响应的内容是什么格式、url附带的查询字符串、请求该网页应该使用的url。

1688



被折叠的 条评论
为什么被折叠?



