(python)基于selenium和requests框架的爬虫爬取广东各城市天气预报(附源码)

前言:大作业要求,老师要我们爬取广东各个城市天气的数据并导出txt文档,然后我又新增了个功能把所有广东城市天气的页面做了个截图并保存到本地文档中,话不多说直接开整。

前期准备:

#需要导入的包,如果没有就在终端运行 pip install xxx(你缺哪个就导哪个)
import re
import time
from lxml import etree
import  requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Edge()#我这里用的驱动是edge的,这里看你们各自浏览器情况,不会下载的百度
driver = webdriver.Edge()
url = "http://www.weather.com.cn/guangdong/index.shtml"
driver.set_window_size(1200, 900)
driver.get(url)
item = driver.find_elements(By.XPATH, '//*[@id="forecastID"]/dl/dt/a')#所有城市xpath元素定位
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
    'Cookie': ''
}

获取地址:

def detail(detail_url, option):
    url = detail_url#定义url
    res = requests.get(url, headers = headers)#获取地址
    paqu_table(res)

根据地址用request框架开爬并写入txt:(直接用一个万能for循环搞定哈哈哈!我看老师文档的代码巨多居复杂所以自己写算了)

def paqu_table(res):
    soup = BeautifulSoup(res.content, 'html.parser')
    tr_all = soup.select('#forecastID')[0]
    tr = tr_all.find_all('dl')
    with open('weather.txt', 'w', encoding='utf-8') as f:
        for j in tr[0:]:
            dd = j.find_all('a')
            gc = (dd[2].get_text().split())#最低气温
            dc = (dd[3].get_text().split())#最高气温
            city = (dd[0].get_text().split())#城市
            res = {'城市': city, '最低气温': gc, '最高气温': dc}
            ress = str(res) + '\n'
            print(ress)
            f.write(str(ress))

新增功能:(基于selenium进行截图,还是老样子for循环通吃,其实这个可以和上面代码合并的,但是懒得弄了,分开更加的清晰易懂)

for i in range(len(item)):
    driver.implicitly_wait(3)
    driver.execute_script("arguments[0].click();", item[i])#item[i].click() 点击
    text = item[i].text#获取城市文本
    time.sleep(5)
    windows = driver.window_handles#获取当前的所有窗口
    driver.switch_to.window(windows[-1])#切换到最新打开的窗口
    driver.save_screenshot(text + "截图.png")#截图
    time.sleep(5)
    driver.close()#关闭当前浏览器
    driver.switch_to.window(driver.window_handles[-1])
    item = driver.find_elements(By.XPATH, '//*[@id="forecastID"]/dl/dt/a')#词句虽上方已经出现,但这里不能省略,因为点击返回到上一页面时页面的元素已经发生改变,如果继续使用上一页面获取的元素,在此页面将会找不到,故需从新获取页面元素
    time.sleep(3)
driver.close()

最后再写个运行就搞掂:

实现效果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值