Why climb the weather? 1. You can practice. 2. After using the itchat library to realize the function of automatic reply, integrate the function of weather check, and realize the function of wechat self-service weather check!
First of all, it's a similar pattern. Let's see if we can grab a general API directly on the official website (XHR). Then directly use API to query OK? Search Baidu for the keyword [weather] or [Nanjing Weather] and the corresponding webpage will pop up: Click http://www.weather.com.cn/weather/101190101.shtml. You can see the weather conditions of the corresponding city in the next week:
In another city, Shanghai, we found that the browser address changed to: http://www.weather.com.cn/weather/101020100.shtml. The original 101020100 number corresponds to the code of the corresponding city. Let's analyze the XHR request on the next page to see if it is possible to grab the package directly?
After Google browser - check - Networt-XHR - refresh, no XHR request is found. It seems that the weather content and city code we need may be included in the page and presented after JS and server processing.... OK, the attempt failed!
Look at the JS request again. It's too much to check one by one. Fortunately, someone on the Internet has already recorded the city codes corresponding to all cities. I copied it and saved it to my local mysql. The data is on Baidu cloud. You can download what you need, and execute SQL to directly build the SQL table and data together. https://pan.baidu.com/s/1kXaN2Aj The password is: 8y6n.
Now that the preparations are finished, the idea is clear. There are cities and codes in China. We can check the weather of a city, just input the city, and get the corresponding city code from mysql, such as 101020100, and then construct the corresponding url: http://www.weather.com.cn/weather/101190101.shtml can view the weather of the corresponding city for 7 days. However, the page does not have XHR and directly available json data, so we can only do it ourselves - analyze the content of the page, and write the regular expression / beautiful soup / XPath to extract the page information. The specific content will not be described here. Please refer to the code for details:
What I don't know in the learning process can add to me python learning resource qun,855408893 //There are good learning video tutorials, development tools and e-books in the group. //Share with you the current talent needs of python enterprises and how to learn python from scratch, and what to learn import re import pymysql import requests from bs4 import BeautifulSoup class SearchWeather(): def __init__(self): self.HEADERS ={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'} self.CONNECTION = pymysql.connect(host='localhost',user='root',password='xxx',db='xxx',charset='utf8',cursorclass=pymysql.cursors.DictCursor) def getcityCode(self,cityName): SQL = "SELECT cityCode FROM cityWeather WHERE cityName='%s'" % cityName try: with self.CONNECTION.cursor() as cursor: cursor.execute(SQL) self.CONNECTION.commit() result = cursor.fetchone() return result['cityCode'] except Exception as e: print(repr(e)) def getWeather(self,cityCode,cityname): url = 'http://www.weather.com.cn/weather/%s.shtml' % cityCode html = requests.get(url,headers = self.HEADERS) html.encoding='utf-8' soup=BeautifulSoup(html.text,'lxml') weather = "date weather [temperature] Wind direction and wind force\n" for item in soup.find("div", {'id': '7d'}).find('ul').find_all('li'): date,detail = item.find('h1').string, item.find_all('p') title = detail[0].string templow = detail[1].find("i").string temphigh = detail[1].find('span').string if detail[1].find('span') else '' wind,direction = detail[2].find('span')['title'], detail[2].find('i').string if temphigh=='': weather += 'Hello[%s]Today's Day:[%s],Temperature:[%s],%s: [%s]\n' % (cityname,title,templow,wind,direction) else: weather += (date + title + "[" + templow + "~"+temphigh +'°C]' + wind + direction + "\n") return weather def main(self,city): cityCode = self.getcityCode(city) detail = self.getWeather(cityCode,city) print (detail) if __name__ == "__main__": weather = SearchWeather() weather.main(city=input('Please enter the city name:'))
The code runs as follows: