本次爬取的首页地址是:
http://www.tianqihoubao.com/lishi/nanjing.html
爬取步骤:
- 爬取主网页,获取进入每个南京市具体年份月份的天气数据的链接
- 爬取上方获取的具体链接的数据
- 存储数据
- 对数据进行筛选后使用pyecharts进行分析
开发工具:
- Python版本:3.5.4
- 相关模块:
import requestsfrom lxml import etreeimport timeimport csvfrom multiprocessing import Pool
使用演示:
- 部分数据如下:
话不多说,马上开始吧!
- 步骤一
- 具体代码如下:
'''遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!'''def get_mainurl(url): #定义获取月份天气的详细url 函数 res = requests.get(url, headers=headers) main_url = [] if res.status_code == 200: #判断请求状态 selector = etree.HTML(res.text) htmlurls = selector.xpath('//div[contains(@id,"content")]/div') #循环点 try: for htmlurl in htmlurls: Jan = htmlurl.xpath('ul[1]/li[2]/a/@href')[0] #一月份天气url main_url.append(Jan) #将网址放入列表中,一个一个放是很蠢的方法,但我也确实不知道其他方法了,下同 Feb = htmlurl.xpath('ul[1]/li[3]/a/@href')[0] #二月份天气url main_url.append(Feb) Mar = htmlurl.xpath('ul[1]/li[4]/a/@href')[0] #同上,下类推 main_url.append(Mar) Apr = htmlurl.xpath('ul[2]/li[2]/a/@href')[0] main_url.append(Apr) May = htmlurl.xpath('ul[2]/li[3]/a/@href')[0] main_url.append(May) June = htmlurl.xpath('ul[2]/li[4]/a/@href')[0] main_url.append(June) July = htmlurl.xpath('ul[3]/li[2]/a/@href')[0] main_url.append(July) Aug = htmlurl.xpath('ul[3]/li[3]/a/@href')[0] main_url.append(Aug) Sep = htmlurl.xpath('ul[3]/li[4]/a/@href')[0] main_url.append(Sep) Oct = htmlurl.xpath('ul[4]/li[2]/a/@href')[0] main_url.append(Oct) Nov = htmlurl.xpath('ul[4]/li[3]/a/@href')[0] main_url.append(Nov) Dec = htmlurl.xpath('ul[4]/li[4]/a/@href')[0] main_url.append(Dec) time.sleep(0.5) #休眠0.5s except IndexError: pass return main_url #将存了所有url的列表返回 else: passdef link_url(url): #上面获取的url是不完整的,此函数使其完整 final_urls= [] list_urls = get_mainurl(url) for list_url in list_urls: if len(list_url) < 30: #因为获取的url有一些少了‘/lishi/’,所以需要判断一下 list_url = 'http://www.tianqihoubao.com/lishi/' + list_url final_urls.append(list_url) else: list_url = 'http://www.tianqihoubao.com' + list_url final_urls.append(list_url) return final_urls
- 步骤二
- 接下来是获取所需的数据,遍历所在节点就行了,需要注意的是要跳过第一个节点,因为其内部没有内容。
代码如下:
'''遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!'''def get_infos(detail_url): #爬取月份天气详细数据函数 main_res = requests.get(detail_url, headers=headers) main_sele = etree.HTML(main_res.text) main_infos = main_sele.xpath('//div[@class="hd"]/div[1]/table/tr') i = True try: for info in main_infos: if i: #此处i的作用是跳过第一次循环,因为第一个是非天气数据 i = False continue else: date = info.xpath('td[1]/a/text()')[0].replace(