关于python:python爬虫入门-urllibbs4快速爬取当前天气信息⛅⛅⛅

3次阅读

共计 4619 个字符,预计需要花费 12 分钟才能阅读完成。

一、指标

指标很简略,就是爬取陕西省各个城市的天气信息,保留在本地!🐛🐛
话不多说,先来张图看看最终的后果。

这就是咱们最终心愿失去的,这里简略阐明一下,大部分天气网站的天气信息可能是图标,图片,或者动图,这些必定是不能保留在 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 定位的时候,会间接把所有城市的数据都解析进去,存在一个列表里。

五、爬虫实现

  1. 引入依赖

    import urllib.request
    from bs4 import BeautifulSoup
    import datetime
  2. 获取以后工夫, 写入文件

    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 吧😝

  1. 爬取文档

    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 曾经足够应用了。具体的信息网上有很多,这里持续偷懒😜

  1. 解析元素
  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:最低气温和最高气温尽管解析了,然而并没有写入文件中,这里打印一下,让大家看看解析进去的列表长什么样子

  1. 遍历列表、组装信息

     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,因为每个城市有白天和夜晚两个气温😣
  1. 获取 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
🔆为了避免一些好人歹意高频率拜访人家的网站,这里就不提供网站的地址了,大家能够本人找一些网站本人操作。🌞在未告知对方的前提下,取得的数据切记不得擅自用于盈利,不能影响他人呦。😷最近疫情十分重大,尤其是上海,心愿咱们的祖国可能尽快战败疫情,大家肯定做好防护,祝大家身体健康
正文完
 0