我们可以看出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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
log.csdnimg.cn/img_convert/8c4513c1a906b72cbf93031e6781512b.png)
三、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。