python爬取中国天气网天气图标准备工作天气预报图例网址:http://www.weather.com.cn/static/html/legend.shtml安装请求:pipinstall请求网页分析打开网页,可以看到有很多图标,分为白天和晚上。我们需要将图标保存到本地,图标名称要一一对应——右键查看网页源代码,发现图标和名称都放在了`]*>.*?'#pictureurlregularimgReg=r']*>([^>]*?)'#colorregularcolorReg=r'bgcolor="(.*?)"'defrun():#抓取网页text=getPage()#获取td标签中的内容lis=re.findall(wrapReg,text,re.S|re.M)foriteminlis:bgcolor=re.findall(colorReg,item,re.S|re.M)imgUrl=re.findall(imgReg,item,re.S|re.M)nameStr=re.findall(nameReg,item,re.S|re.M)如果imgUrl和len(imgUrl)>0和名称Str和len(nameStr)>0和bgcolor和len(bgcolor)>0:print('------------')print(imgUrl[0],nameStr[0],bgcolor[0])首先,我们获取网页的源码res.text,然后匹配包裹图片和名称的td标签。这里为什么要匹配td元素呢?后面会解释re.findall(pattern,string,flags=0)返回string中所有匹配pattern的字符串,返回形式为数组wrapReg=r']*>.*?'1.一。是匹配除n(换行符)以外的任意字符2.*前一个字符出现0次或多次后面的所有内容都是结尾4..*?非贪心,遇到开头和结尾就拦截,所以拦截多次匹配的结果,中间没有字符会被拦截5.(.*?)非贪心,同上是一样的,但是比上面多了一个括号,只保留括号里的内容。这里如果加上括号,只会返回td标签的子元素,不会返回td标签本身。修饰符描述re.I使得匹配对Case-insensitivere.L做locale-aware匹配re.M多行匹配,影响^和$re.SMake。匹配包括换行符在内的所有字符re.U根据Unicode字符集解析字符。这个标志影响\w,\W,\b,\B.re.X这个标志让你写出更容易理解的正则表达式,给你一个更灵活的格式图片url和天气名称,在td标签下,还有一个p>a标签包,图片只需要img标签src属性里的内容,天气名称就是整个a标签里的内容,这里注意最后下载的括号位置并根据图片url和天气名称保存图片,不过还有一个问题需要注意。把网页拉到最下面,发现td标签可能是空的,需要先判断是否有正确匹配再继续。另外还需要匹配一个td属性,bgcolor,这个后面也会讲解下载保存图片#后缀regularsuffixReg=r'\.([^.]*?)$'defsaveFile(url,name,bgcolor):#获取后缀suffix=re.findall(suffixReg,url)#下载文件res=requests.get(url)#根据bgcolor区分昼夜文件路径filePath='day/'ifbgcolor=='#FEE6C5'else'night/'print('filePath->',filePath)#文件名fileName=filePath+name+'.'+suffix[0]withopen(fileName,'wb')asf:#savethefilef.write(res.content)beforef.close提到过,为什么要匹配包含td标签,什么是使用背景颜色?删除td标签本身不是更干净吗?这是因为白天和晚上的天气名称是一样的。如果不区分白天和黑夜,则保存白天的图片。当程序执行保存夜间图片时,白天图片将被替换。然而,白天和黑夜的图片和名字是一样的。有什么方法可以区分白天和黑夜吗?回去看源码,发现白天和晚上的td标签都有一个属性,白天是bgcolor="#FEE6C5",晚上是bgcolor="#D8E7F8",所以可以利用这个属性来白天的图片区分保存到day目录下,晚上的图片保存到night目录下。需要在当前路径新建day和night文件夹,否则会报错。另外,保存图片时,只有图片名称,没有图片后缀,图片url只有图片后缀,所以可以根据图片url的后缀来判断文件后缀完整代码