从0到1教你用Python来爬取整站天气网,腾讯T3大佬亲自教你

我们可以看出url中缺少前面的部分,follow方法可以自动拼接url,通过meta方法来传递需要保存的city名字,通过callback方法来调度将下一个爬取的URL

  • weather.py

def parse(self, response):

city_urls = response.xpath(‘//div[@class=“all”]/div[@class=“bottom”]//li/a/@href’).extract()[16:17]

city_names = response.xpath(‘//div[@class=“all”]/div[@class=“bottom”]//li/a/text()’).extract()[16:17]

self.logger.info(‘正在爬去{}城市url’.format(city_names[0]))

for city_url, city_name in zip(city_urls, city_names):

用的follow快捷方式,可以自动拼接url

yield response.follow(url=city_url, meta={‘city’: city_name}, callback=self.parse_month)

这时就是定义parse_month函数,首先分析月份的详情页,拿到月份的url

在这里插入图片描述

还是在scrapy.shell 中一步一步调试

在这里插入图片描述

通过follow方法拼接url,meta来传递city_name要保存的城市名字,selenium:True先不管

然后通过callback方法来调度将下一个爬取的URL,即就是天的爬取详细页

  • weather.py

def parse_month(self, response):

“”"

解析月份的url

:param response:

:return:

“”"

city_name = response.meta[‘city’]

self.logger.info(‘正在爬取{}城市的月份url’.format(city_name[0]))

由于爬取的信息太大了,所有先爬取前5个

month_urls = response.xpath(‘//ul[@class=“unstyled1”]/li/a/@href’).extract()[0:5]

for month_url in month_urls:

yield response.follow(url=month_url, meta={‘city’: city_name, ‘selenium’: True}, callback=self.parse_day_data)

现在将日的详细页的信息通过xpah来取出

在这里插入图片描述

发现竟然为空

在这里插入图片描述

同时发现了源代码没有该信息

在这里插入图片描述

说明了是通过js生成的数据,scrapy只能爬静态的信息,所以引出的scrapy对接selenium的知识点,所以上面meta传递的参数就是告诉scrapy使用selenium来爬取。

复写WeatherSpiderDownloaderMiddleware下载中间件中的process_request函数方法

  • middlewares.py

import time

import scrapy

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

class WeatherSpiderDownloaderMiddleware(object):

def process_request(self, request, spider):

if request.meta.get(‘selenium’):

为了让浏览器能够无界面的工作

chrome_options = Options()

设置chrome浏览器无界面模式

chrome_options.add_argument(‘–headless’)

driver = webdriver.Chrome(chrome_options=chrome_options)

用浏览器去访问这个地址

driver.get(request.url)

time.sleep(1.5) # 因为浏览器需要加载渲染

html = driver.page_source

driver.quit()

return scrapy.http.HtmlResponse(url=request.url, body=html, encoding=‘utf-8’, request=request)

return None

激活WeatherSpiderDownloaderMiddleware

DOWNLOADER_MIDDLEWARES = {

‘weather_spider.middlewares.WeatherSpiderDownloaderMiddleware’: 543,

‘weather_spider.middlewares.RandomUserAgentMiddleware’:900,

}

最后编写weather.py中的剩下代码

from …items import WeatherSpiderItem

def parse_day_data(self, response):

“”"

解析每天的数据

:param response:

:return:

“”"

node_list = response.xpath(‘//tr’)

去掉表头

node_list.pop(0)

print(response.body)

print(‘开始爬取……’)

print(node_list)

for node in node_list:

item = WeatherSpiderItem

item[‘city’] = response.meta[‘city’]

item[‘date’] = node.xpath(‘./td[1]/text()’).extract_first()

item[‘aqi’] = node.xpath(‘./td[2]/text()’).extract_first()

item[‘level’] = node.xpath(‘./td[3]//text()’).extract_first()

item[‘pm25’] = node.xpath(‘./td[4]/text()’).extract_first()

item[‘pm10’] = node.xpath(‘./td[5]/text()’).extract_first()

item[‘so2’] = node.xpath(‘./td[6]/text()’).extract_first()

item[‘co’] = node.xpath(‘./td[7]/text()’).extract_first()

item[‘no2’] = node.xpath(‘./td[8]/text()’).extract_first()

item[‘o3_8h’] = node.xpath(‘./td[9]/text()’).extract_first()

yield item

入库操作


这里入的库是Mongodb,在settings.py中配置

MONGO_URI=‘192.168.96.128’ #虚拟机ip

MONGO_DB=‘weather’ #表名

对于入门主要处理的是pipelines中

  • pipelines.py

import pymongo

class MongoPipeline(object):

def init(self,mongo_uri,mongo_db):

self.mongo_uri=mongo_uri

self.mongo_db=mongo_db

@classmethod

def from_crawler(cls, crawler):

return cls(

mongo_uri=crawler.settings.get(‘MONGO_URI’),

mongo_db=crawler.settings.get(‘MONGO_DB’)

)

def open_spider(self, spider): # 当爬虫开启时连接MongoDB数据库

self.client = pymongo.MongoClient(self.mongo_uri)

self.db = self.client[self.mongo_db]

def process_item(self, item, spider):

name = item.class.name

self.db[name].insert(dict(item)) # 保存数据

return item

def close_spider(self, spider): # 当爬虫关闭时关闭数据库连接

self.client.close()

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
img

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

log.csdnimg.cn/img_convert/8c4513c1a906b72cbf93031e6781512b.png)

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

  • 24
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值