提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
爬取的网站:http://www.weather.com.cn/textFC
采用BeautifulSoup库爬取数据和pymysql导入数据库
import requests
from bs4 import BeautifulSoup
import pymysql
代码如下(示例):
conn = pymysql.connect(host='localhost', user='root', passwd='密码', db='weather', port=3306, charset='utf8')
cursor = conn.cursor()
# 使用 execute() 方法执行 SQL,如果表存在则删除
cursor.execute("DROP TABLE IF EXISTS tianqi")
# 使用预处理语句创建表
cursor.execute("CREATE TABLE tianqi "
"(city varchar(20) not null , weather varchar(20), wind varchar(20), wind_power varchar(20), max varchar(10), min varchar(10))")
conn.commit()
代码如下(示例):
# 定义一个函数解析网页
def parse_page(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36',
}
response = requests.get(url, headers=headers)
# print(response.content.decode('utf-8')) # 解决乱码,打印网页源码
text = response.content.decode('utf-8')
# 网页解析
soup = BeautifulSoup(text, 'html5lib')
## 1. 找网页元素conMidtab
conMidtab = soup.find('div', class_='conMidtab')
# print(conMidtab)
## 2.找table标签, find_all返回一个列表
tables = conMidtab.find_all('table')
# 遍历table标签,找出需要的标签,以网页源码为准
for table in tables:
## 3. 找tr标签,过滤掉前两个tr标签
trs = table.find_all('tr')[2:]
# enumerate()会返回2个值:1)索引;2)索引对应元素。
for index, tr in enumerate(trs):
## 4. 找td标签,
tds = tr.find_all('td')
city_td = tds[0] # 城市
if index == 0:
city_td = tds[1]
# stripped_strings:获取一个标签下面子孙节点的文本信息,返回的是生成器对象,要转化为list
city = list(city_td.stripped_strings)[0] # 只要文本
# print(city)
weather_td = tds[1] # 天气现象
if index == 0:
weather_td = tds[2]
weather = list(weather_td.stripped_strings)[0]
# 风向
wind_td = tds[2].find_all('span')
if index == 0:
wind_td = tds[3].find_all('span')
wind_span = wind_td[0]
wind = list(wind_span.stripped_strings)[0]
# 风力
wind_power_sp = wind_td[1]
wind_power = list(wind_power_sp.stripped_strings)[0]
# print(wind, wind_power)
temp_max_td = tds[-5]
temp_max = list(temp_max_td.stripped_strings)[0]
# print(temp_max)
temp_min_td = tds[-2] # 最低温度
temp_min = list(temp_min_td.stripped_strings)[0]
# print(temp_min)
print(city, weather, temp_max + '℃', temp_min + '℃', wind, wind_power)
cursor.execute('insert into tianqi(city,weather,wind,wind_power,max,min) values(%s,%s,%s,%s,%s,%s)',
(city, weather, wind, wind_power, temp_max, temp_min))
conn.commit()
main函数传入url,并关闭数据库连接与游标
def main():
# lst = []
urls = ['http://www.weather.com.cn/textFC/hb.shtml', # 华北地区
'http://www.weather.com.cn/textFC/db.shtml', # 东北地区
'http://www.weather.com.cn/textFC/hd.shtml', # 华东地区
'http://www.weather.com.cn/textFC/hz.shtml', # 华中地区
'http://www.weather.com.cn/textFC/hn.shtml', # 华南
'http://www.weather.com.cn/textFC/xn.shtml', # 西南
'http://www.weather.com.cn/textFC/xb.shtml', # 西北
'http://www.weather.com.cn/textFC/gat.shtml'] # 港澳台地区
for url in urls:
# 调用函数
parse_page(url)
cursor.close()
conn.close()
if __name__ == '__main__':
main()
注意观察原网站的源代码,此次爬虫遇到港澳台页面与其他的html代码有些不同,需要特殊处理。在td标签中获取城市名称时,每个省或直辖市的table里的tr标签里的第一个td标签都不是城市名,而是省份或者直辖市的名称,采用enumerate()方法返回index,从而解决该问题。
文章内容有些还自己改的,有些是参考了其他大佬的代码,写的还是有些冗余,不精简,望各位大佬批评指正。