前言:大作业要求,老师要我们爬取广东各个城市天气的数据并导出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()
最后再写个运行就搞掂:
实现效果: