一、指标
指标很简略,就是爬取陕西省各个城市的天气信息,保留在本地!🐛🐛
话不多说,先来张图看看最终的后果。
这就是咱们最终心愿失去的,这里简略阐明一下,大部分天气网站的天气信息可能是图标,图片,或者动图,这些必定是不能保留在 txt 文件中的,最终可能的后果如上图所示。在本文最初,会贴出来爬取动静图片的代码,供大家参考交换👊。
二、装置依赖
1. import urllib.request
urllib 是 python 内置的 http 申请库,不须要装置间接就能够应用
2. from bs4 import BeautifulSoup
bs4 是一个非常简单易用的解析工具,anaconda 自带,也能够通过 pip 下载
3. import datetime
datetime 是 python 自带的工夫模块,次要是为了记录爬取的工夫信息
三、元素抉择简略介绍
<div id="testid">
<div class="testclass">
<ul>
<li> 我是测试 001</li>
<li> 我是测试 002</li>
</ul>
</div>
<div>
如果你写过 css,那你肯定分明,如果咱们心愿定位 li 标签下的‘我是测试 001’和‘我是测试 002’。罕用的办法是应用标签选择器,id 选择器,类选择器等等,不同的选择器能够复合应用。
标签选择器:间接将标签名作为选择器。例如‘div’,即可抉择所有 div 标签下的元素
id 选择器:应用‘#’+ 标签的 id 名作为选择器,每个标签的 id 是惟一的不可反复。例如‘#testid’,即可选中 id 为‘testid’的标签
类选择器:应用‘.’+ 标签的 class 作为选择器,不同标签的 class 可能雷同。例
如‘.testclass’,即可抉择有 calss 为‘testclass’的标签
同时,也将不同的选择器组合起来应用,例如上述示例代码中,为了精准定位‘我是测试 001’和‘我是测试 002’,能够这样写:`#testid .testclass ul li`
它的意思是,id 是 testid 标签下的类名为 testclass 标签下的 ul 标签下的 li 标签。bs4 能够为咱们提供一样的语法来帮咱们定位解析爬取下来的文档内容,获取咱们想要的信息。这也是为什么 bs4 简略易用的起因。除了上述的选择器定位元素之外,还有其余的办法诸如:xpath、正则等👀。
四、剖析网页,定位信息
在开始写爬虫之前,咱们先剖析一下将要爬取的天气网站,看看咱们心愿失去哪些信息。
⚠爬虫爬取数据须要留神法律标准,严禁歹意攻打别人网站,或者盗用他人的数据非法盈利
框出来的局部就是咱们想要的信息,接着定位咱们心愿失去的信息。浏览器的控制台能够帮忙咱们疾速定位元素,以谷歌浏览器为例:按下图的步骤操作之后,再在页面上点击本人心愿定位的元素。
接着依照下面提到的选择器,定位元素即可😤。以西安为例:首先,咱们心愿爬取的所有信息都在类名为 forecast 的 div 标签下的类名 forecastBox 的 div 标签下的 dl 标签中。城市名在 dt 标签下的 a 标签中。(✨✨这里插一嘴,a 标签是一个点击之后能够跳转至新页面的标签,新页面的 url 地址就是 a 标签上 href 指定的内容,即点击西安之后,咱们就能跳转上面的网页。很显然这个页面是西安天气更加具体的详细信息,😍urllib 能够帮忙咱们爬取 a 标签指定的页面的内容。所以咱们能够顺便定位剖析这个页面的内容,获取更加具体的天气信息。定位的办法大同小异,大家能够本人试试😚😚)
dd 标签下的第一个 a 标签下有两个 img 标签,别离对应了白天的天气和夜间的天气,这就是结尾提到的不能保留在 txt 文件中的图片,只能存下来图片的门路了😞(网站中有专门介绍天气图标的页面)
dd 标签下的第二个 a 标签和第三个 a 标签上面的 span 标签则是今日的最高气温和最低气温
仔细的搭档可能会发现,存在很多个 dl 标签,这就是写法标准的网站,陕西省上面的其余城市都和西安是相似的,这其实也为咱们提供了便当😸,应用 bs4 定位的时候,会间接把所有城市的数据都解析进去,存在一个列表里。
五、爬虫实现
-
引入依赖
import urllib.request from bs4 import BeautifulSoup import datetime
-
获取以后工夫, 写入文件
now_time = datetime.datetime.now() time1_str = datetime.datetime.strftime(now_time,'%Y-%m-%d %H:%M:%S') fl = open(r'陕西省天气信息.txt',"a+",encoding='utf-8') fl.write("抓取工夫:"+time1_str) fl.write('\n') fl.close()
次要是 python 的文件操作,这里小小偷个懒,大家本人 search 吧😝
-
爬取文档
url="http:/testt/test.shtml" #示例 url,并不实在存在 response=urllib.request.urlopen(url) d=response.read() soup=BeautifulSoup(d,"lxml")
python 内置的 urllib 下的 request 模块的 urlopen 应用 GET 形式对网站发动申请
urlopen 返回的 response 对象是 http.client.HTTPResponse 类型,次要蕴含 read()、readinfo()、getheader(name)、getheaders()、fileno()等办法。
应用 BeautifulSoup 对文档解析,第一个参数是要解析的文档内容,第二个参数申明解析的形式,个别 lxml 曾经足够应用了。具体的信息网上有很多,这里持续偷懒😜
- 解析元素
ls_Url_Name = soup.select('.forecastBox dl dt a')
ls_WeatherInfo = soup.select('.forecastBox dl dd a img')
ls_MinTem = soup.select('.forecastBox dl dd a b')
ls_TopTem = soup.select('.forecastBox dl dd a span')
应用 select 能够依照下面介绍的选择器快速访问标签
ls_Url_Name 是一个寄存每个城市名 a 标签的列表
ls_WeatherInfo 是寄存每个城市白天气温和夜间气温 img 标签的列表
ls_MinTem 是寄存每个城市最低气温的列表
ls_TopTem 是寄存每个城市最高气温的列表
PS:最低气温和最高气温尽管解析了,然而并没有写入文件中,这里打印一下,让大家看看解析进去的列表长什么样子
-
遍历列表、组装信息
j=0 for i in range(0,len(ls_Url_Name)): str1 = ""str1 = str1 + ls_Url_Name[i].get_text()+"\n"str1 = str1 +" 白天天气信息:"+ ls_WeatherInfo[j].attrs['src'] +" "str1 = str1 +" 夜晚天气信息:"+ ls_WeatherInfo[j+1].attrs['src'] +"\n" j+=2
这里就用最简略字符串拼接的办法来组装咱们须要的信息。😂
有了上述标签列表,bs 还提供了一些办法帮忙咱们获取标签中的信息
get_text() 能够获取标签中的文本信息
PS: 申明一个 j 变量,每次循环的时候 j 的步数应该是 2,因为每个城市有白天和夜晚两个气温😣
-
获取 a 标签的 href,进去详情页面
url = ls_Url_Name[i].attrs['href'] response=urllib.request.urlopen(url) d=response.read() soup=BeautifulSoup(d,"lxml") str1 = str1 + "以后天气信息:" + soup.select('.c7d ul li .wea')[0].get_text() + "\n" str1 = str1 + "以后气温:" + soup.select('.c7d ul li .tem')[0].get_text() str1 = str1 + "以后风向:" + soup.select('.c7d ul li .win em span')[0].attrs['title'] + "" +" 以后风速:"+ soup.select('.c7d ul li .win i')[0].get_text() +'\n' print(str1)
bs 解析出的标签的 attrs 中蕴含了元素的各个属性,咱们要失去的就是 a 标签的 href 属性
取得详情页面的 url 之后,和之前的操作方法雷同,申请详情页面,解析元素,取得咱们须要的信息,组装字符串,最初写进文件即可
附上遍历列表的残缺代码
j=0
for i in range(0,len(ls_Url_Name)):
str1 = ""str1 = str1 + ls_Url_Name[i].get_text()+"\n"str1 = str1 +" 白天天气信息:"+ ls_WeatherInfo[j].attrs['src'] +" "str1 = str1 +" 夜晚天气信息:"+ ls_WeatherInfo[j+1].attrs['src'] +"\n"
j+=2
url = ls_Url_Name[i].attrs['href']
response=urllib.request.urlopen(url)
d=response.read()
soup=BeautifulSoup(d,"lxml")
str1 = str1 + "以后天气信息:" + soup.select('.c7d ul li .wea')[0].get_text() + "\n"
str1 = str1 + "以后气温:" + soup.select('.c7d ul li .tem')[0].get_text()
str1 = str1 + "以后风向:" + soup.select('.c7d ul li .win em span')[0].attrs['title'] + "" +" 以后风速:"+ soup.select('.c7d ul li .win i')[0].get_text() +'\n'
print(str1)
fl = open(r'陕西省天气信息.txt',"a+",encoding='utf-8')
fl.write(str1)
fl.write('\n')
fl.close()
完😏
附:爬取天气图标
import os
ls = soup.select('.forecastBox dl dd a img')
j=1 #爬取天气图标测试
for i in ls:
str1 = i.attrs['src']
str1 = page1 + str1
if os.path.exists("D:/imags") == False:
os.mkdir("D:/imags")
bytes = urllib.request.urlopen(str1)
str3 = "D:/imags/test"+str(j)+'.gif'
f = open(str3,'wb')
f.write(bytes.read())
f.flush()
f.close()
j+=1
🔆为了避免一些好人歹意高频率拜访人家的网站,这里就不提供网站的地址了,大家能够本人找一些网站本人操作。🌞在未告知对方的前提下,取得的数据切记不得擅自用于盈利,不能影响他人呦。😷最近疫情十分重大,尤其是上海,心愿咱们的祖国可能尽快战败疫情,大家肯定做好防护,祝大家身体健康