Python爬虫-使用Scrapy框架爬取某网站热点新闻排行并保存数据库

本文主要是介绍Python爬虫-使用Scrapy框架爬取某网站热点新闻排行并保存数据库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【背景】

    今天使用Scrapy来爬取某网站热点新闻,因可能的版权原因,里面的数据和网址都做了脱敏处理。

页面如下: 

 

爬下来的数据如下所示:

 

 数据分别是:序号、热点标题、热点内容、热点URL链接、热点排行、热度值

图片和数据对应不上的原因是,热点新闻的截图是我写博客的时候才截图的,数据是前几天爬取的。

在这之前我们先了解一下什么是Scrapy

Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛
框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便
Scrapy 使用了 Twisted’twɪstɪd异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求

一、安装Scrapy

执行pip命令安装

pip install scrapy

二、生成爬虫框架

执行以下命令

scrapy startproject baidu_spider

 生成的框架如下所示:

各文件功能分别是:

  • scrapy.cfg:配置文件
  • spiders:存放你Spider文件,也就是你爬取的py文件
  • items.py:相当于一个容器,和字典较像
  • middlewares.py:定义Downloader Middlewares(下载器中间件)和Spider Middlewares(蜘蛛中间件)的实现
  • pipelines.py:定义Item Pipeline的实现,实现数据的清洗,储存,验证。
  • settings.py:全局配置

三、生成爬虫

scrapy genspider baidu baidu.com

结果如下

四、补全代码

在settings.py中增加如下配置项

ITEM_PIPELINES = {"baidu_spider.pipelines.BaiduSpiderPipeline": 300,"baidu_spider.pipelines.BaiduSpiderPrintPipeline": 200
}MYSQL_HOST='localhost'
MYSQL_USER='xxxx'
MYSQL_PWD='xxxx'
MYSQL_DB='xxxx'
MYSQL_CHARSET='utf8'

 pipelines对应的是两个解析后的网页数据输出管道,后面有交代

baidu.py中的代码补全后如下:

import scrapy
from baidu_spider.items import BaiduSpiderItemclass BaiduSpider(scrapy.Spider):name = "baidu"allowed_domains = ["www.baidu.com"]start_urls = ["https://top.xxxx.com/board?tab=realtime"]def parse(self, response):filename = "baidu_realtime.html"# open(filename, 'wb+').write(response.body)items = []for each in response.xpath('//*[@id="sanRoot"]/main/div[2]/div/div[2]/div'):item = BaiduSpiderItem()title = each.xpath('div[2]/a/div[1]/text()').extract()content = each.xpath('(div[2]/div[1]/text())[1]').extract()url = each.xpath('div[2]/a/@href').extract()hot = each.xpath('div[1]/div[2]/text()').extract()rank = each.xpath('a/div[1]/text()').extract()# print("title::::::::$title")# print("content::::::::$content")# print("url::::::::$url")# print("rank::::::::$rank")item['title'] = titleitem['content'] = contentitem['url'] = urlitem['rank'] = rankitem['hot'] = hotyield item# items.append(item)# return items

其中start_urls就是要爬取的网页

parse(self, response)函数就是对网页内容进行解析

items.py补全后的代码如下:

import scrapyclass BaiduSpiderItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()# passtitle = scrapy.Field()url = scrapy.Field()content = scrapy.Field()rank = scrapy.Field()hot = scrapy.Field()

这里定义了热点新闻解析后,需要获取的指标

管道pipelines.py中的代码如下:

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interfacefrom itemadapter import ItemAdapter
import pymysql
from baidu_spider.settings import *class BaiduSpiderPrintPipeline:def process_item(self, item, spider):print(item['title'],item['content'],item['url'],item['rank'],item['hot'])return itemclass BaiduSpiderPipeline:def open_spider(self, spider):self.db = pymysql.connect(host=MYSQL_HOST,user=MYSQL_USER,password=MYSQL_PWD,database=MYSQL_DB,charset=MYSQL_CHARSET)self.cursor = self.db.cursor()def process_item(self, item, spider):insert_sql = "insert into spider_baidu_news(title, content, url, rank, hot) values (%s, %s, %s, %s, %s)"insert_parms = [item['title'],item['content'],item['url'],item['rank'],item['hot']]self.cursor.execute(insert_sql, insert_parms)self.db.commit()return itemdef close_spider(self, spider):self.cursor.close()self.db.close()print('执行了close_spider方法,项目已经关闭')

主要是定义了两个输出管道类,BaiduSpiderPrintPipeline和BaiduSpiderPipeline

每个管道里面可以重写以下三个方法:

  • def open_spider(self, spider):    处理数据前执行,只执行一次,用于连接数据库之类的操作,避免每次写数据之前都要连接数据库;
  • def process_item(self, item, spider):    处理数据,没条数据都会调用一次;
  • def close_spider(self, spider):    处理数据后执行,只执行一次,用于释放数据库连接、关闭文件之类的操作;

五、运行代码

运行命令如下

scrapy crawl baidu -o  realtime.csv

-o:是把管道数据输出到文件

也可以在工程跟目录下生成一个main.py,免的每次在命令行执行

from scrapy import cmdlinecmdline.execute('scrapy crawl baidu -o realtime.csv'.split())

 执行后数据库中已经可以看到数据:

csv文件中数据如下:

 

五、总结

     可以看到,整个代码框架还是非常简洁清晰的,很多Python初学者,都是把所有的逻辑写在一个文件里面,这样会导致代码非常凌乱,找起代码来非常困难,有了Scrapy后,就没有这个烦恼了,Scrapy已经把整个框架规划好了,我们只要补全业务代码就可以了。

这篇关于Python爬虫-使用Scrapy框架爬取某网站热点新闻排行并保存数据库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/327965

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:2895356150@qq.com,资源源于网络,本介绍用于学习使用,如有侵权请您联系删除! 2.新增快速版,简洁易上手 支持快速版和专业版切换使用,快速版界面简洁,保留主

如何免费的去使用connectedpapers?

免费使用connectedpapers 1. 打开谷歌浏览器2. 按住ctrl+shift+N,进入无痕模式3. 不需要登录(也就是访客模式)4. 两次用完,关闭无痕模式(继续重复步骤 2 - 4) 1. 打开谷歌浏览器 2. 按住ctrl+shift+N,进入无痕模式 输入网址:https://www.connectedpapers.com/ 3. 不需要登录(也就是

Python 字符串占位

在Python中,可以使用字符串的格式化方法来实现字符串的占位。常见的方法有百分号操作符 % 以及 str.format() 方法 百分号操作符 % name = "张三"age = 20message = "我叫%s,今年%d岁。" % (name, age)print(message) # 我叫张三,今年20岁。 str.format() 方法 name = "张三"age

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念,将逐步规范化一个例子,逐级说明每个范式的要求和变换过程。 示例:学生课程登记系统 初始表格如下: 学生ID学生姓名课程ID课程名称教师教师办公室1张三101数学王老师101室2李四102英语李老师102室3王五101数学王老师101室4赵六103物理陈

数据库期末复习知识点

A卷 1. 选择题(30') 2. 判断范式(10') 判断到第三范式 3. 程序填空(20') 4. 分析填空(15') 5. 写SQL(25') 5'一题 恶性 B卷 1. 单选(30') 2. 填空 (20') 3. 程序填空(20') 4. 写SQL(30') 知识点 第一章 数据库管理系统(DBMS)  主要功能 数据定义功能 (DDL, 数据定义语

给数据库的表添加字段

周五有一个需求是这样的: 原来数据库有一个表B,现在需要添加一个字段C,我把代码中增删改查部分进行了修改, 比如insert中也添入了字段C。 但没有考虑到一个问题,数据库的兼容性。因为之前的版本已经投入使用了,再升级的话,需要进行兼容处理,当时脑子都蒙了,转不过来,后来同事解决了这个问题。 现在想想,思路就是,把数据库的表结构存入文件中,如xxx.sql 实时更新该文件: CREAT

Toolbar+DrawerLayout使用详情结合网络各大神

最近也想搞下toolbar+drawerlayout的使用。结合网络上各大神的杰作,我把大部分的内容效果都完成了遍。现在记录下各个功能效果的实现以及一些细节注意点。 这图弹出两个菜单内容都是仿QQ界面的选项。左边一个是drawerlayout的弹窗。右边是toolbar的popup弹窗。 开始实现步骤详情: 1.创建toolbar布局跟drawerlayout布局 <?xml vers