此链接是正则表达式的知识点,知识点与实例结合起来有助于理解哦!—— Python基础——正则表达式
使用正则表达式爬取武功未来15天天气预报
本次我使用的是 " 天气网 " 进行爬虫,爬取的地方名为 " 武功 " ,网站为 www.tianqi.com。本网站可能会反爬虫,解决办法如下:
- 进入该网站,搜索 "武功" 进行天气查询,然后点击 "武功15天天气",进入下面第二张图的界面。
- 在空白处单击右键,点击 "查看元素" ——>" 网络"(此时若无任何信息,则在下图所示的界面重新搜索一下"武功",便可刷新出来)——> "状态"——>单击任意一条 "状态"——>"消息头"——>双击 "User-Agent",使其完全展开,复制——>接下来就是创建合适的 http请求了,具体见代码。
代码如下:
import re
import requests
from prettytable import PrettyTable
url='https://www.tianqi.com/wugong/15/'
#反爬虫
txt=requests.get(url,headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0","Host":"www.tianqi.com"}).text
print("武功未来15天天气预报".center(50,'-'))
m0=re.compile(r'<h3><b>(\d\d月\d\d日)</b>') #日期
m1=re.compile(r' (<em>)?(\w+)(</em>)?<') #星期
m2=re.compile(r'temp">(\w+)') #天气
m3=re.compile(r'(-?\d+)~<b>(-?\d+)</b>℃<') #温度
m4=re.compile(r'<li>(\w+) (\d+级)<') #风向及级别
m5=re.compile(r'<h3><b>(\d\d月\d\d日)</b> (<em>)?(\w+)(</em>)?<.+?temp">(\w+).+?(-?\d+)~<b>(-?\d+)</b>℃<.+?<li>(\w+) (\d+级)<',re.S)
result=m5.findall(txt)
table=PrettyTable(['日期','星期','天气','温度/℃','风向','级别'])
for recode in result:
riqi=recode[0]
xingqi=recode[2]
tianqi=recode[4]
wendu=(recode[5]+'~'+recode[6])
fengxiang=recode[7]
jibie=recode[8]
list=[riqi,xingqi,tianqi,wendu,fengxiang,jibie]
table.add_row(list)
print(table)
运行结果如下: