目标网站http://www.tianqihoubao.com/lishi/

一.创建项目+初始化爬虫文件:

scrapy startpoject tianqihoubao
cd tianqihoubao
scrapy genspider weather www.tianqihoubao.com

二.配置settings.py

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.30'

ROBOTSTXT_OBEY = False #君子协议 注释掉或者改为false

ITEM_PIPELINES = {
'tianqihoubao.pipelines.TianqihoubaoPipeline': 300,
'tianqihoubao.pipelines.MySQLStoreCnblogsPipeline': 300
} # 连接数据MySQL
# 数据库地址
MYSQL_HOST = 'localhost'
# 数据库用户名:
MYSQL_USER = 'root'
# 数据库密码
MYSQL_PASSWORD = '123456'
# 数据库端口
MYSQL_PORT = 3306
# 数据库名称
MYSQL_DBNAME = 'data'
# 数据库编码
MYSQL_CHARSET = 'utf8'

三.修改items.py

import scrapy

class TianqihoubaoItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
riqi = scrapy.Field()
tianqi = scrapy.Field()
qiwen = scrapy.Field()
wind = scrapy.Field()

四.编写weather.py

scrapy.Request()教程:Scrapy爬虫入门教程十一 Request和Response(请求和响应)

import scrapy

from tianqihoubao.items import TianqihoubaoItem

class WeatherSpider(scrapy.Spider):
name = 'weather'
allowed_domains = ['www.tianqihoubao.com']
start_urls = ['http://www.tianqihoubao.com/lishi/shijiazhuang.html'] def parse(self, response):
#for path in self.start_urls:
data = response.xpath('//div[@id="content"]/table[@class="b"]/tr')
next_page = response.xpath('//div[@id="content"]/div[@class="box pcity"]/ul/li/a/@href').extract()
for i in data[1:]:
item = TianqihoubaoItem()
item['riqi'] = i.xpath('./td/a/text()').extract()[0].replace('\r\n', '').replace('\n', '').replace(' ', '').strip()
item['tianqi'] = i.xpath('./td/text()').extract()[2].replace('\r\n', '').replace('\n', '').replace(' ', '').strip()
item['qiwen'] = i.xpath('./td/text()').extract()[3].replace('\r\n', '').replace('\n', '').replace(' ', '').strip()
item['wind'] = i.xpath('./td/text()').extract()[4].replace('\r\n', '').replace('\n', '').replace(' ', '').strip()
#print(item['tianqi']) yield item print("下一页", next_page)
if next_page and len(next_page) > 5:
# 翻页
for i in next_page:
yield scrapy.Request(url='http://www.tianqihoubao.com'+i, callback=self.parse)
else:
print("没有下一页了" * 10)
print(data)

五.配置pipelines.py(一个保存为csv,一个保存到mysql上)

import copy
import csv
import time from pymysql import cursors
from twisted.enterprise import adbapi class TianqihoubaoPipeline(object):
# 保存为csv格式
def __init__(self):
# 打开文件,指定方式为写,利用第3个参数把csv写数据时产生的空行消除
self.f = open("weather.csv", "a", newline="", encoding="utf-8")
# 设置文件第一行的字段名,注意要跟spider传过来的字典key名称相同
self.fieldnames = ["riqi", "tianqi", "qiwen", "wind"]
# 指定文件的写入方式为csv字典写入,参数1为指定具体文件,参数2为指定字段名
self.writer = csv.DictWriter(self.f, fieldnames=self.fieldnames)
# 写入第一行字段名,因为只要写入一次,所以文件放在__init__里面
self.writer.writeheader() def process_item(self, item, spider):
# 写入spider传过来的具体数值
self.writer.writerow(item)
# 写入完返回
return item def close(self, spider):
self.f.close() class MySQLStoreCnblogsPipeline(object):
# 初始化函数
def __init__(self, db_pool):
self.db_pool = db_pool # 从settings配置文件中读取参数
@classmethod
def from_settings(cls, settings):
# 用一个db_params接收连接数据库的参数
db_params = dict(
host=settings['MYSQL_HOST'],
user=settings['MYSQL_USER'],
password=settings['MYSQL_PASSWORD'],
port=settings['MYSQL_PORT'],
database=settings['MYSQL_DBNAME'],
charset=settings['MYSQL_CHARSET'],
use_unicode=True,
# 设置游标类型
cursorclass=cursors.DictCursor
)
# 创建连接池
db_pool = adbapi.ConnectionPool('pymysql', **db_params) # 返回一个pipeline对象
return cls(db_pool) # 处理item函数
def process_item(self, item, spider):
# 对象拷贝,深拷贝 --- 这里是解决数据重复问题!!!
asynItem = copy.deepcopy(item) # 把要执行的sql放入连接池
query = self.db_pool.runInteraction(self.insert_into, asynItem) # 如果sql执行发送错误,自动回调addErrBack()函数
query.addErrback(self.handle_error, item, spider) # 返回Item
return item # 处理sql函数
def insert_into(self, cursor, item):
# 创建sql语句
sql = "INSERT INTO weather (riqi,tianqi,qiwen,wind) VALUES ('{}','{}','{}','{}')".format(
item['riqi'], item['tianqi'], item['qiwen'], item['wind'])
# 执行sql语句
cursor.execute(sql)
# 错误函数 def handle_error(self, failure, item, spider):
# #输出错误信息
print("failure", failure)

六.结果

 这个在爬取的时候没有按时间顺序来,后续在搞一搞

scrapy框架爬取国际庄2011-2022的天气情况的更多相关文章

  1. 使用scrapy框架爬取自己的博文(2)

    之前写了一篇用scrapy框架爬取自己博文的博客,后来发现对于中文的处理一直有问题- - 显示的时候 [u'python\u4e0b\u722c\u67d0\u4e2a\u7f51\u9875\u76 ...

  2. scrapy框架爬取笔趣阁完整版

    继续上一篇,这一次的爬取了小说内容 pipelines.py import csv class ScrapytestPipeline(object): # 爬虫文件中提取数据的方法每yield一次it ...

  3. scrapy框架爬取笔趣阁

    笔趣阁是很好爬的网站了,这里简单爬取了全部小说链接和每本的全部章节链接,还想爬取章节内容在biquge.py里在加一个爬取循环,在pipelines.py添加保存函数即可 1 创建一个scrapy项目 ...

  4. Python使用Scrapy框架爬取数据存入CSV文件(Python爬虫实战4)

    1. Scrapy框架 Scrapy是python下实现爬虫功能的框架,能够将数据解析.数据处理.数据存储合为一体功能的爬虫框架. 2. Scrapy安装 1. 安装依赖包 yum install g ...

  5. 爬虫入门(四)——Scrapy框架入门:使用Scrapy框架爬取全书网小说数据

    为了入门scrapy框架,昨天写了一个爬取静态小说网站的小程序 下面我们尝试爬取全书网中网游动漫类小说的书籍信息. 一.准备阶段 明确一下爬虫页面分析的思路: 对于书籍列表页:我们需要知道打开单本书籍 ...

  6. 使用scrapy框架爬取自己的博文(3)

    既然如此,何不再抓一抓网页的文字内容呢? 谷歌浏览器有个审查元素的功能,就是按树的结构查看html的组织形式,如图: 这样已经比较明显了,博客的正文内容主要在div 的class = cnblogs_ ...

  7. 使用scrapy框架爬取自己的博文

    scrapy框架是个比较简单易用基于python的爬虫框架,http://scrapy-chs.readthedocs.org/zh_CN/latest/ 这个是不错的中文文档 几个比较重要的部分: ...

  8. 基于python的scrapy框架爬取豆瓣电影及其可视化

    1.Scrapy框架介绍 主要介绍,spiders,engine,scheduler,downloader,Item pipeline scrapy常见命令如下: 对应在scrapy文件中有,自己增加 ...

  9. scrapy框架爬取豆瓣读书(1)

    1.scrapy框架 Scrapy,Python开发的一个快速.高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试 ...

随机推荐

  1. cpolar——安全的内网穿透工具

    什么是cpolar? cpolar是一种安全的内网穿透云服务,它将内网下的本地服务器通过安全隧道暴露至公网,使得公网用户可以正常访问内网服务. 它能用在哪些场景? 微信公众号开发,实时断点调试微信消息 ...

  2. JZ-029-最小的 K 个数

    标题 最小的 K 个数 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 题目链接: 最小的 K 个数 代码 import ja ...

  3. .NetCore Web Api 利用ActionFilterAttribute统一接口返回值格式

    .Net Core 同 Asp.Net MVC一样有几种过滤器,这里不再赘述每个过滤器的执行顺序与作用. 在实际项目开发过程中,统一API返回值格式对前端或第三方调用将是非常必要的,在.NetCore ...

  4. 矩池云利用ipykernel为JupyterLab添加kernel以及展示出来

    source activate myconda pip install ipykernel python -m ipykernel install --user --name myconda --di ...

  5. 36 异常机制 自定义异常 实际应用中的经验总结 尽量添加finally语句块去释放占用的资源

    自定义异常 概念 使用Java内置的异常可以描述在编辑时出现的大部分异常情况.除此之外,用户还可以自定义异常.用户自定义异常类,只需继承Exception类即可. 在程序中使用自定义异常类,大体可分为 ...

  6. Net中事件的用法之一

    1.事件与委托的关系 委托是一种类型 事件是委托的一个实例 事件中涉及两种角色--事件发布者和事件订阅者. 事件发布者: 触发事件的对象称为事件发布者. 事件订阅者: 捕获事件并对其做出处理的对象称为 ...

  7. vmware下的manjaro挂载共享文件夹

    开始时在archwiki上看到的是以下命令 mkdir <shared folders root directory> vmware-hgfsclient vmhgfs-fuse -o a ...

  8. 不带头结点的单链表(基于c语言)

    本篇文章的代码大多使用无头结点的单链表: 相关定义: #include <stdio.h> #include <stdlib.h> #include <assert.h& ...

  9. LinuxCNC中RS-274/NGC解析器的编译和使用

    原文 http://blog.sina.com.cn/s/blog_a2a6dd380102vrai.html LinuxCNC是一个著名的开源数控软件,目前最新发行版本是:LinuxCNC 2.6. ...

  10. Material Design with the Android Design Support Library

    Material Design with the Android Design Support Library 原文http://www.sitepoint.com/material-design-a ...