python爬虫selenium和bs4_利用python的bs4和selenium库结合实现动态页面的爬取(爬取天气网上面的历史天气数据)...

报告分析需要历史气象数据,查询到天气网上面有历史天气数据,从2011年到2018年,第一次接触爬虫,在网上找了爬取天气网历史数据的python源码,利用bs4库,但是实际操作中发现soup.select( )函数返回的列表总是[ ] (空),查询发现天气网目前使用的是javascript写的动态页面,可能是为了防止爬虫接入。经过查资料又找到了一种爬取动态页面的方法,经尝试方法有效,写个博客记录一下,也算是感谢网络上分享知识的网友,也便于自己日后查询使用方便。

先贴上完整的代码,再附上自己简单的理解,最后是附上自己的参考链接。

语言:python3,用到的库:bs4、pandas、selenium

完整源代码如下:

from bs4 import BeautifulSoup

import pandas as pd

from selenium import webdriver

for month in range(1,13,1):

print("开始爬取"+"2016年"+str(month)+"月的数据...")

driver=webdriver.Ie()

#driver.maximize_window()

if month < 10:

url='http://lishi.tianqi.com/shuangpai/2016'+'0'+str(month)+'.html'

else:

url='http://lishi.tianqi.com/shuangpai/2016'+str(month)+'.html'

driver.get(url)

html_text=driver.page_source

soup = BeautifulSoup(html_text, 'html.parser')

weather_list=soup.select('div[class="tqtongji2"]')

for weather in weather_list:

ul_list = weather.select('ul')

data_all=[]

for i in ul_list:

li_all=i.select("li")

data=[]

for j in li_all:

data.append(j.text)

data_all.append(data)

weather=pd.DataFrame(data_all)

weather.columns=["日期","最高气温","最低气温","天气","风向","风力"]

weather.drop([0],inplace=True)

if month==1:

weather.to_csv("2016shuangpai.csv",mode='a',index=False,header=True,encoding="utf_8_sig")

else:

weather.to_csv("2016shuangpai.csv",mode='a',index=False,header=False,encoding="utf_8_sig")

print("2016年"+str(month)+"月的数据爬取完毕")

driver.close()

原理:通过借助iedriverserver.exe操纵ie浏览器打开指定url的网页,浏览器就会获得网页的源码,接下来就和爬取静态网页的原理相同了,只需要利用bs4库中的BeautifulSoup解析源码,获取指定的数据就可以了。具体步骤和注意事项有:

1.下载iedriverserver.exe,也可以用Chrome、Firefox浏览器下载对应的chromedriver.exe和firefoxdriver.exe,我试过Chrome,发现打开浏览器后请求url页面有时能打开,有时打不开,就选用了ie,ie使用基本正常。此处要注意,浏览器驱动的下载需要和浏览器是对应的版本,版本不同会报错,不过我没试过不同版本,都是按照网上说的下载的对应版本,我在下面贴出我查找到的ie和chrome的驱动下载地址,firefox的大家自行搜索。务必注意版本对应问题。其次下载后的驱动解压后把可执行文件放在和python脚本同一个目录下,当然放在任意目录通过也可以配置环境变量调用。

2.下面是对代码的说明:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值