使用python scrapy爬取天气并导出csv文件
作者:Haohao+++ 发布时间:2023-02-25 16:16:10
爬取xxx天气
爬取网址:https://tianqi.2345.com/today-60038.htm
安装
pip install scrapy
我使用的版本是scrapy 2.5
创建scray爬虫项目
在命令行如下输入命令
scrapy startproject name
name为项目名称
如,scrapy startproject spider_weather
之后再输入
scrapy genspider spider_name 域名
如,scrapy genspider changshu tianqi.2345.com
查看文件夹
- spider_weather
- spider
- __init__.py
- changshu.py
- __init__.py
- items.py
- middlewares.py
- pipelines.py
- settings.py
- scrapy.cfg
文件说明
名称 | 作用 |
---|---|
scrapy.cfg | 项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中) |
items.py | 设置数据存储模板,用于结构化数据,如:Django的Model |
pipelines | 数据处理行为,如:一般结构化的数据持久化 |
settings.py | 配置文件,如:递归的层数、并发数,延迟下载等 |
spiders | 爬虫目录,如:创建文件,编写爬虫规则 |
开始爬虫
1.在spiders文件夹里面对自己创建的爬虫文件进行数据爬取、如在此案例中的spiders/changshu.py
代码演示如下
import scrapy
class ChangshuSpider(scrapy.Spider):
name = 'changshu'
allowed_domains = ['tianqi.2345.com']
start_urls = ['https://tianqi.2345.com/today-60038.htm']
def parse(self, response):
# 日期、天气状态、温度、风级
# 利用xpath解析数据、不会xpath的同学可以去稍微学习一下,语法简单
dates = response.xpath('//a[@class="seven-day-item "]/em/text()').getall()
states = response.xpath('//a[@class="seven-day-item "]/i/text()').getall()
temps = response.xpath('//a[@class="seven-day-item "]/span[@class="tem-show"]/text()').getall()
winds = response.xpath('//a[@class="seven-day-item "]/span[@class="wind-name"]/text()').getall()
# 返回每条数据
for date, state, temp, wind in zip(dates,states,temps,winds):
yield {
'date' : date,
'state': state,
'temp': temp,
'wind': wind
}
2.在settings.py文件中进行配置
修改UA
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
修改机器爬虫配置
ROBOTSTXT_OBEY = False
整个文件如下:
# Scrapy settings for spider_weather project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
# https://docs.scrapy.org/en/latest/topics/settings.html
# https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
# https://docs.scrapy.org/en/latest/topics/spider-middleware.html
BOT_NAME = 'spider_weather'
SPIDER_MODULES = ['spider_weather.spiders']
NEWSPIDER_MODULE = 'spider_weather.spiders'
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
# Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS = 32
# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
#DOWNLOAD_DELAY = 3
# The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16
# Disable cookies (enabled by default)
#COOKIES_ENABLED = False
# Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False
# Override the default request headers:
#DEFAULT_REQUEST_HEADERS = {
# 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
# 'Accept-Language': 'en',
#}
# Enable or disable spider middlewares
# See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
#SPIDER_MIDDLEWARES = {
# 'spider_weather.middlewares.SpiderWeatherSpiderMiddleware': 543,
#}
# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#DOWNLOADER_MIDDLEWARES = {
# 'spider_weather.middlewares.SpiderWeatherDownloaderMiddleware': 543,
#}
# Enable or disable extensions
# See https://docs.scrapy.org/en/latest/topics/extensions.html
#EXTENSIONS = {
# 'scrapy.extensions.telnet.TelnetConsole': None,
#}
# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# ITEM_PIPELINES = {
# 'spider_weather.pipelines.SpiderWeatherPipeline': 300,
# }
# Enable and configure the AutoThrottle extension (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/autothrottle.html
#AUTOTHROTTLE_ENABLED = True
# The initial download delay
#AUTOTHROTTLE_START_DELAY = 5
# The maximum download delay to be set in case of high latencies
#AUTOTHROTTLE_MAX_DELAY = 60
# The average number of requests Scrapy should be sending in parallel to
# each remote server
#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# Enable showing throttling stats for every response received:
#AUTOTHROTTLE_DEBUG = False
# Enable and configure HTTP caching (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
#HTTPCACHE_ENABLED = True
#HTTPCACHE_EXPIRATION_SECS = 0
#HTTPCACHE_DIR = 'httpcache'
#HTTPCACHE_IGNORE_HTTP_CODES = []
#HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'
3.然后在命令行中输入如下代码
scrapy crawl changshu -o weather.csv
注意:需要进入spider_weather路径下运行
scrapy crawl 文件名 -o weather.csv(导出文件)
4.结果如下
补充:scrapy导出csv时字段的一些问题
scrapy -o csv格式输出的时候,发现输出文件中字段的顺序不是按照items.py中的顺序,也不是爬虫文件中写入的顺序,这样导出的数据因为某些字段变得不好看,此外,导出得csv文件不同的item之间被空行隔开,本文主要描述解决这些问题的方法。
1.字段顺序问题:
需要在scrapy的spiders同层目录,新建csv_item_exporter.py文件内容如下(文件名可改,目录定死)
from scrapy.conf import settings
from scrapy.contrib.exporter import CsvItemExporter
class MyProjectCsvItemExporter(CsvItemExporter):
def init(self, *args, **kwargs):
delimiter = settings.get(‘CSV_DELIMITER', ‘,')
kwargs[‘delimiter'] = delimiter
fields_to_export = settings.get(‘FIELDS_TO_EXPORT', [])
if fields_to_export :
kwargs[‘fields_to_export'] = fields_to_export
super(MyProjectCsvItemExporter, self).init(*args, **kwargs)
2)在settings.py中新增以下内容
#定义输出格式
FEED_EXPORTERS = {
‘csv': ‘project_name.spiders.csv_item_exporter.MyProjectCsvItemExporter',
}
#指定csv输出字段的顺序
FIELDS_TO_EXPORT = [
‘name',
‘title',
‘info'
]
#指定分隔符
CSV_DELIMITER = ‘,'
设定完毕,执行scrapy crawl spider -o spider.csv的时候,字段就按顺序来了
2.输出csv有空行的问题
此时你可能会发现csv文件中有空行,这是因为scrapy默认输出时,每个item之间的分隔符是空行
解决办法:
在找到exporters.py的CsvItemExporter类,大概在215行中增加newline="",即可。
也可以继承重写CsvItemExporter类
总结
来源:https://blog.csdn.net/qq_42025868/article/details/121245980


猜你喜欢
- 最近在看《深度学习:基于Keras的Python实践(魏贞原)》这本书,书中8.3创建了一个Scikit-Learn的Pipeline,首先
- 介绍该数独可能只填充了部分数字,其中缺少的数字用 . 表示。注意事项一个合法的数独(仅部分填充)并不一定是可解的。我们仅需使填充的空格有效即
- 网站域名一般都会选简短易记的,因为这对于网站宣传来说也可以省不少力。而被很多网站忽视的站内Url结构则在一定程度上反映出网站的整体架构。当设
- 用pytesseract识别图片中的数字Win 平台 使用步骤一、安装包。二、找个图片,运行如下识别程序。示例程序:import pytes
- 有两个结构完全相同的表,由其中一个表插入另一个表中指定条件的数据,报如下错误: 仅当使用了列列表并且 IDENTITY_INSERT 为 O
- Qt是一种基于C++的跨平台图形用户界面应用程序开发框架。如何跨平台?上到服务器上位机,下到嵌入式GUI,上天入地无所不能。Qt最早是由19
- 1 简介DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表。或许说它可能有点像matlab的矩
- MAC下MYSQL5.7.17无法连接的问题,下载安装完SQLBench_community 6.3.9后新建MYSQL CONNECTIO
- 创建表书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-
- 基数排序法又称桶子法(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些"桶&
- 一、两层结构的ASP应用有何缺点 在Browser/Server 应用程序开发领域,微软公司的IIS/ASP以其强大的功能,良好的扩展能力,
- 本文实例讲述了python使用分治法实现求解最大值的方法。分享给大家供大家参考。具体分析如下:题目:给定一个顺序表,编写一个求出其最大值和最
- python基于新浪sae开发的微信公众平台,实现功能:输入段子---回复笑话输入开源+文章---发送消息到开源中国输入快递+订单号---查
- 本文实例为大家分享了Vue+ Antv F2实现层叠柱状图的具体代码,供大家参考,具体内容如下一、 创建canvas标签<canvas
- 二、基本概念1、数据库数据库(DB):即DataBase的缩写,是按照一定的数据结构来组织、存储和管理数据的一个仓库。是存储在一起的相关数据
- ClickHouse是近年来备受关注的开源列式数据库(DBMS),主要用于数据联机分析(OLAP)领域,于2016年开源。目前国内社区火热,
- PHP生成桌面快捷方式就是这么的简单,大家生成的时候改下你要生成的网站即可。dianji.html代码:<a href="a
- 最近在处理Qzone黄钻图标更新时,想起近期对业务图标进行优化所遇到的一些问题,把思绪收拾起来和大家一共探讨,欢迎多方声音。在实际工作中,图
- 如下所示:from pymongo import MongoClient#建立和数据库系统的连接,指定host及port参数client =
- 本文描述通过统计分析出医院信息系统需分区的表,对需分区的表选择分区键,即找出包括在你的分区键中的列(表的属性),对大型数据的管理比较有意义,