爬虫项目实战十五:爬取天气信息

爬取天气信息

      • 目标
      • 项目准备
      • 项目分析
      • 代码实现
      • 连接数据库
      • 测试效果
      • 完整代码
      • 小插曲,避免踩坑指南

目标

爬取天气信息,并将数据保存到数据库中。

项目准备

软件:Pycharm
第三方库:requests,pymysql,BeautifulSoup
api接口:http://wthrcdn.etouch.cn/WeatherApi?city=城市名

项目分析

访问天气api接口
这里查看苏州的天气信息
所以把api这样修改

http://wthrcdn.etouch.cn/WeatherApi?city=苏州

爬虫项目实战十五:爬取天气信息_第1张图片
ok可以访问
这里的信息有很多,所以只爬取一部分作为测试就好。

代码实现

import requests
from bs4 import BeautifulSoup
print('请输入城市名称:')
cityname=input()
url='http://wthrcdn.etouch.cn/WeatherApi?city={}'.format(cityname)

response=requests.get(url)
content=response.text
soup=BeautifulSoup(content,'lxml')
#日期
date=[]
target=soup.find_all('date')
for each in target:
    date.append(each.text)
#最高温度
high=[]
target=soup.find_all('high')
for each in target:
    high.append(each.text)
#最低温度
low=[]
target=soup.find_all('low')
for each in target:
    low.append(each.text)
#light
light=[]
target=soup.find_all('day')
for each in target:
    light.append(each.text)

#night
night=[]
target=soup.find_all('night')
for each in target:
    night.append(each.text)

打印看一下

length=len(date)
for i in range(length):
    print(date[i],high[i],low[i],light[i],night[i])

爬虫项目实战十五:爬取天气信息_第2张图片
OK,爬取完成

连接数据库

这里使用MySQL
首先创建数据库
爬虫项目实战十五:爬取天气信息_第3张图片
创建表
爬虫项目实战十五:爬取天气信息_第4张图片
1.导入模块
导入第三方库:import pymysql

2.连接数据库

# 连接database
database = pymysql.connect(
    host="主机名",#localhost
    port="端口",#默认应该是3306,注意这里不加引号
    user ="用户名",#mysql的用户名
    password ="密码",#设置的密码
    database ='数据库名',#使用的数据库名
    charset ='utf8')#指定为utf-8编码格式

3.创建游标对象

cursor = database.cursor()  # 执行完毕返回的结果集默认以元组显示

4.定义要执行的SQL语句

sql = "INSERT INTO weather(日期,最高温度,最低温度,白天,黑夜) values (%s,%s,%s,%s,%s)"
    value=(date[i],high[i],low[i],light[i],night[i])

5.执行SQL语句

cursor.execute(sql,value)
database.commit()  # 提交数据库

6.关闭游标对象关闭数据库

cursor.close()
database.close()

测试效果

爬虫项目实战十五:爬取天气信息_第5张图片
爬虫项目实战十五:爬取天气信息_第6张图片
已存入数据库
命令行中显示效果

mysql> select * from weather;
+------------+-----------+-----------+------------+------------+
| 日期       | 最高温度  | 最低温度  | 白天       | 黑夜       |
+------------+-----------+-----------+------------+------------+
| 15日星期四 | 高温 21| 低温 16| 阵雨东北风 | 中雨东北风 |
| 16日星期五 | 高温 18| 低温 14| 中雨东北风 | 阴东北风   |
| 17日星期六 | 高温 21| 低温 16| 阴北风     | 多云北风   |
| 18日星期天 | 高温 20| 低温 15| 阵雨东北风 | 阵雨东北风 |
| 19日星期一 | 高温 18| 低温 14| 阴东北风   | 多云东北风 |
+------------+-----------+-----------+------------+------------+
5 rows in set (0.00 sec)

完整代码

import requests
from bs4 import BeautifulSoup
import pymysql
print('请输入城市名称:')
cityname=input()
url='http://wthrcdn.etouch.cn/WeatherApi?city={}'.format(cityname)

response=requests.get(url)
content=response.text
soup=BeautifulSoup(content,'lxml')
#日期
date=[]
target=soup.find_all('date')
for each in target:
    date.append(each.text)
#最高温度
high=[]
target=soup.find_all('high')
for each in target:
    high.append(each.text)
#最低温度
low=[]
target=soup.find_all('low')
for each in target:
    low.append(each.text)
#light
light=[]
target=soup.find_all('day')
for each in target:
    light.append(each.text)

#night
night=[]
target=soup.find_all('night')
for each in target:
    night.append(each.text)

length=len(date)
# 连接database
database = pymysql.connect(
    host="主机名",#localhost
    port="端口",#默认应该是3306,注意这里不加引号
    user ="用户名",#mysql的用户名
    password ="密码",#设置的密码
    database ='数据库名',#使用的数据库名
    charset ='utf8')#指定为utf-8编码格式
cursor = database.cursor()  # 执行完毕返回的结果集默认以元组显示
for i in range(length):
    # 定义要执行的SQL语句
    sql = "INSERT INTO weather(日期,最高温度,最低温度,白天,黑夜) values (%s,%s,%s,%s,%s)"
    value=(date[i],high[i],low[i],light[i],night[i])
    cursor.execute(sql,value)
    database.commit()  # 提交数据库
cursor.close()
database.close()

小插曲,避免踩坑指南

开始的时候,数据写入到数据库,在可视化工具中,中文显示正常。但是在命令行中中文显示的全是乱码,就像这样。

mysql> select * from weather;
+----------------+--------------+--------------+-----------------+-----------------+
| 鏃ユ湡         | 鏈€楂樻俯搴?| 鏈€浣庢俯搴?| 鐧藉ぉ          | 榛戝          |
+----------------+--------------+--------------+-----------------+-----------------+
| 15鏃ユ槦鏈熷洓     | 楂樻俯 21鈩?    | 浣庢俯 16鈩?    | 闃甸洦涓滃寳椋?     | 涓洦涓滃寳椋?     |
| 16鏃ユ槦鏈熶簲     | 楂樻俯 18鈩?    | 浣庢俯 14鈩?    | 涓洦涓滃寳椋?     | 闃翠笢鍖楅        |
| 17鏃ユ槦鏈熷叚     | 楂樻俯 21鈩?    | 浣庢俯 16鈩?    | 闃村寳椋?         | 澶氫簯鍖楅        |
| 18鏃ユ槦鏈熷ぉ     | 楂樻俯 20鈩?    | 浣庢俯 15鈩?    | 闃甸洦涓滃寳椋?     | 闃甸洦涓滃寳椋?     |
| 19鏃ユ槦鏈熶竴     | 楂樻俯 18鈩?    | 浣庢俯 14鈩?    | 闃翠笢鍖楅        | 澶氫簯涓滃寳椋?     |
+----------------+--------------+--------------+-----------------+-----------------+
5 rows in set (0.00 sec)

查了很多方面的资料,看了很多博客,都是说:命令行输入show variables like 'char%';修改为utf-8编码
好,照做

mysql> show variables like 'char%';
+--------------------------+-----------------------------------+
| Variable_name            | Value                             |
+--------------------------+-----------------------------------+
| character_set_client     | utf8                              |
| character_set_connection | utf8                              |
| character_set_database   | utf8                              |
| character_set_filesystem | binary                            |
| character_set_results    | utf8                              |
| character_set_server     | utf8                              |
| character_set_system     | utf8                              |
| character_sets_dir       | E:\software\mysql\share\charsets\ |
+--------------------------+-----------------------------------+
8 rows in set (0.00 sec)

已修改,再次

爬虫项目实战十五:爬取天气信息_第7张图片
这种方法不可行。
如果遇到这种,请这样。
1.找到自己mysql安装位置,找到my.ini文件,编辑
爬虫项目实战十五:爬取天气信息_第8张图片
修改这里为gbk编码,之后之后别忘记保存。
爬虫项目实战十五:爬取天气信息_第9张图片
2.命令行输入:net stop mysql
这里mysql服务已关闭
net start mysql
开启mysql

C:\Users\acer>net stop mysql
MySQL 服务正在停止..
MySQL 服务已成功停止。


C:\Users\acer>net start mysql
MySQL 服务正在启动 .
MySQL 服务已经启动成功。

3.命令行运行mysql

mysql> select * from weather;
+------------+-----------+-----------+------------+------------+
| 日期       | 最高温度  | 最低温度  | 白天       | 黑夜       |
+------------+-----------+-----------+------------+------------+
| 15日星期四 | 高温 21| 低温 16| 阵雨东北风 | 中雨东北风 |
| 16日星期五 | 高温 18| 低温 14| 中雨东北风 | 阴东北风   |
| 17日星期六 | 高温 21| 低温 16| 阴北风     | 多云北风   |
| 18日星期天 | 高温 20| 低温 15| 阵雨东北风 | 阵雨东北风 |
| 19日星期一 | 高温 18| 低温 14| 阴东北风   | 多云东北风 |
+------------+-----------+-----------+------------+------------+
5 rows in set (0.00 sec)

OK,已经成功解决问题。

你可能感兴趣的:(python爬虫学习笔记)