scrapy框架 爬取重庆工程学院

目的:爬取重庆工程学院 中的管理学院的学院动态

百度搜索重庆工程学院,看到如图所示

因为我使用scarpy框架,不知道如何创建项目的,可以看看我之前的文章(简单的理了一下步奏)

Scrapy 架构

下图是 Scrapy 框架的组成结构,并从数据流的角度揭示 Scrapy 的工作原理


对于用户来说, Spider 是最核心的组件, Scrap y 爬虫开发是围绕实现 Spider 展开 的。接下来,看一下在框架中的数据流。Request 和 Response 是 HTTP 协议中的术语, 即 HTTP 请求和 HTTP 响应,Scrap y 框架中定义了相应的 Request 和 Response 类,这里的 Item 代表 Spider 从页面中爬取的一项数据。 最后,我们来说明以上几种对象在框架中的流动过程。

1、当 SPIDER 要爬取某 URL 地址的页面时, 需使用该 URL 构造一个 Request 对象, 提 交给 ENGINE(图 1)。

2、Request对象随后进入SCHEDULER按某种算法进行排队,之后的某个时刻SCHEDULER 将其出队, 送往 DOWNLOADER(图中的 2、3、4)

3、DOWNLOADER 根据 Request 对象中的 URL 地址发送一次 HTTP 请求到网站服务器, 之 后用服务器返回的 HTTP 响应构造出一个 Response 对象, 其中包含页面的 HTML 文本 (图 2 中的 5)

4、Response 对象最终会被递送给 SPIDER 的页面解析函数(构造 Request 对象时指定) 进行处理,页面解析函数从页面中提取数据, 封装成 Item 后提交给 PIPELINES 进行处理, 最终可能由 Exporter 以某种数据格式写入文件(CSV、json 等);另一方面页面解析函数还 从页面中提取链接 url,构造出新的 Request 对象提交给 Engine(图 6,7,8)。

理解了框架中的数据流,也就理解了 Scrapy 爬虫的工作原理。如果把框架中的组件比 作人体的各个器官,Request 和 Response 对象便是血液,Item 则是代谢产物

(一)首先分析页面

通过工具,我们可以发现我们需要的内容位于 li 标签当中,是一条一条的数据,其中的信息包含有时间、标题和详情页的链接,但是我们发现了一个问题,就是超链接的href属性并不完全,所以当我们需要爬取更多详情页的信息时,需要将链接补充完整。

我们可以看出,在第一阶段我们可以爬取到的有三个实体,链接(url),时间(date),标题(title),因为后面要做详情页的爬取,所以我选择在详情页的时候在爬取标题,当然在这爬取是一样的,只有你的XPath是找对了是没有问题。

我使用的是谷歌浏览器,安装了一个插件(XPath Helper),可以自己去下载哟,下载之后解压,在浏览器的右上角,点击下方如图所示:

再 点击 “更多程序”—>“扩展程序” —>将“开发者工具”打开—>“加载已解压的扩展程序”

选择好了就可以用了哟!!!!

接下来就是重头戏哟!!!

创建爬虫项目和文件

我使用的是 Anconda里面的Spyder,使用pycharm也是可以的,只要自己熟悉就可以啦~~~~

我还是写下创建项目的命令

scrapy startproject cqie

创建文件:

cd cqie  #进入项目
scrapy genspider cqiel  cqie.edu.cn  # cqiel是爬虫名  cqie.edu.cn是域名,千万不能写成http://www.cqie.edu.cn/,不了解域名的,可以去学习学习...

接下来就是编写代码了:

首先是cqiel.py文件
def parse(self, response):item={}# print(response.text)entryList=response.xpath("//div[@class='sortlist']/dl//li")# print(len(entryList))for i in entryList:item['url'] = response.urljoin(i.xpath("./a/@href").get())item['date'] = i.xpath("./span/text()").get()#print(item)yield item
深层网页爬取:



scrapy.Request:
常用参数说明
Url:
Callback:回调函数,执行完成当前方法后调用
Meta:元数据,用于数据传递

def parse_detail(self, response):item=response.meta['item']item['title']=response.xpath("//div[@id='text']/h1/text()").get()item['laiyuan']=response.xpath("//div[@id='text']/h3/text()").get().split()[1].replace("来源:","")item['author']=response.xpath("//div[@id='text']/h3").xpath("substring-before(.,'来源:')").get().replace("发布人:","").strip(' ')#获取内容con=response.xpath("//div[@id='showcontent']").xpath('string(.)').extract()content=""for i in con:content=content.join(i.split())item['content']=contentprint(item)yield item

完整代码:

import scrapy
import copy
# from cqie.items import CqieItem
class CqielSpider(scrapy.Spider):name = 'cqiel'allowed_domains = ['cqie.edu.cn']start_urls = ['http://gl.cqie.edu.cn/html/11/xydt']  #管理学院def parse(self, response):item={}# print(response.text)entryList=response.xpath("//div[@class='sortlist']/dl//li")# print(len(entryList))for i in entryList:item['url'] = response.urljoin(i.xpath("./a/@href").get())item['date'] = i.xpath("./span/text()").get()# print(item)# yield itemyield scrapy.Request(item['url'],meta={'item':copy.deepcopy(item)},callback=self.parse_detail)# breaknextpage = response.xpath('//*[@class="page"]//a[contains(text(),"下一页")]/@href').get()  # 获取下一页if nextpage:nextpage = response.urljoin(nextpage)yield scrapy.Request(nextpage, callback=self.parse, dont_filter=True)def parse_detail(self, response):item=response.meta['item']item['title']=response.xpath("//div[@id='text']/h1/text()").get()item['laiyuan']=response.xpath("//div[@id='text']/h3/text()").get().split()[1].replace("来源:","")item['author']=response.xpath("//div[@id='text']/h3").xpath("substring-before(.,'来源:')").get().replace("发布人:","").strip(' ')#获取内容con=response.xpath("//div[@id='showcontent']").xpath('string(.)').extract()content=""for i in con:content=content.join(i.split())item['content']=contentprint(item)yield item

Scrapy若干问题:

1.Scrapy crawl cqiel -o cqie.csv 输出列顺序混乱

解决方案:Settings配置文件中增加
FEED_EXPORT_FIELDS 后指定输出列,如果不指定就不会输出
FEED_EXPORT_FIELDS = [“title”,“url”,“date”]

2.Scrapy crawl cqiel -o cqie.csv 输出的CSV文件Excel打开乱码

解决方案:Settings配置文件中增加

FEED_EXPORT_ENCODING=“GBK”

将数据存进数据库

Item Pipeline 数据管道,负责对爬取到的数据进行处理。除了使用使用-o 参数将 item 的结果输出为 CSV、Json、XML 等类型的数据外,将数据存储在数据库中也是常用的方式之一。下面以豆 瓣电影案例为例,说明如何将数据保存在 MySQL 数据库中。

mysql

1.安装mysql
2.创建表结构

create table cqie(
url varchar(50),
title varchar(50),
content varchar(200)
)

3.配置 mysql 数据库的链接参数 在settins.py文件中配置mysql数据库中必要的链接参数。包括
主机名(MYSQL_DB_HOST )、端口(MYSQL_DB_PORT)、数据库名称(MYSQL_DB_NAME)、连接用户(MYSQL_DB_USER)、 密码(MYSQL_DB_PASSWORD)。

MYSQL_DB_HOST="服务器 IP"
MYSQL_DB_PORT=3306 #端口
MYSQL_DB_NAME="数据库名称"
MYSQL_DB_USER="用户名"
MYSQL_DB_PASSWORD="密码"

4.创建 pipeline 类
在 pipelines.py 中 添 加 class 。 需 要 注 意 的 是 类 中 的 方 法 名 open_spider 、 process_item、close_spider 必须固定,如方法名错误可以正常运行,但不会有数据正常 插入。类名读者可以自行修改。模板代码如下:

class MySQLPipeline: #开始爬取数据之前被调用 #读取配置文件,初始化连接以及游标 def open_spider(self, spider): pass #每解析完一个 item 调用 #插入数据 def process_item(self, item, spider): pass #爬取完全部数据后被调用 #提交数据,释放连接 def close_spider(self, spider): pass

5.修改配置文件 Settings,加入到数据清洗的管道
在 Settings.py 中找到 ITEM_PIPELINES 后修正配置,否则无法运行。

ITEM_PIPELINES = { # 'scrapy.pipelines.images.ImagesPipeline': 1, 'cqie.pipelines.MySQLPipeline':200, #项目名称.pipelines.类名'cqie.pipelines.CqiePipeline_mongo':200 #项目名称.pipelines.类名
}

6.open_spider 方法
open_spider 方法在开始爬取数据之前被调用,在该方法中通过 spider.settings 对象 读取用户在配置文件中指定的数据库,然后建立与数据库的连接,将得到的 Connection 对 象和 Cursor 对象分别赋值给 self.db_conn 和 self.db_cur,以便之后使用。

 #开始爬取数据之前被调用#读取配置文件,初始化连接以及游标def open_spider(self, spider):host=spider.settings.get("MYSQL_DB_HOST")port=spider.settings.get("MYSQL_DB_PORT")name = spider.settings.get("MYSQL_DB_NAME")user = spider.settings.get("MYSQL_DB_USER")pwd = spider.settings.get("MYSQL_DB_PASSWORD")#print(host,port,name,user,password)self.db_conn = pymysql.connect(host=host, port=port,db=name,user=user,password=pwd)self.db_cur=self.db_conn.cursor()

也可以像我这样设置数据库那些

 #开始爬取数据之前被调用#读取配置文件,初始化连接以及游标def open_spider(self, spider):host=spider.settings.get("MYSQL_DB_HOST","10.8.16.231")port=spider.settings.get("MYSQL_DB_PORT",3306)name = spider.settings.get("MYSQL_DB_NAME", "cq")user = spider.settings.get("MYSQL_DB_USER", "cqie")pwd = spider.settings.get("MYSQL_DB_PASSWORD", "cqie123")#print(host,port,name,user,password)self.db_conn = pymysql.connect(host=host, port=port,db=name,user=user,password=pwd)self.db_cur=self.db_conn.cursor()

7.process_item 方法

process_item 方法处理爬取到的每一项数据,执行插入数据操作的 SQL 语句。但需要 注意的是,在 process_item 方法中并没有调用连接对象的 commit 方法,也就意味着此时数 据并没有实际写入数据库。如果每插入一条数据都调用一次 commit 方法,会严重降低程序 执行效率,并且我们对数据插入数据库的实时性并没有什么要求,因此可以在爬取完全部数 据后再调用 commit 方法。
%s 为占位符,不能加单引号或双引号。

 def process_item(self, item, spider):values = (item["url"],item["title"],item["author"])sql = "insert into cqie(url,title,author) values(%s,%s,%s)"# print(sql)self.db_cur.execute(sql, values)return item

8.close_spider 方法
close_spider 方法在爬取完全部数据后被调用,在该方法中,调用连接对象的 commit 方法将之前所有的插入数据操作一次性提交给数据库,然后关闭连接对象。

 #爬取完全部数据后被调用#提交数据,释放连接
def close_spider(self,spider): self.db_conn.commit() self.db_cur.close() self.db_conn.close()

爬取结果:

mongodb

要在下图中安装pymongo,命令为

pip install pymongo

1.安装mongodb

2.在settings.py文件中添加数据库的配置项

MONGO_HOST = "127.0.0.1"  # 主机IP
MONGO_PORT = 27017  # 端口号
MONGO_DB = "cq"  # 库名
MONGO_COLL = "cqie"  # collection名
MONGO_USER = "root"
MONGO_PSW = "123456"

首先需要在mongodb中授权,在将数据写入mongodb中时,要将mongodb启动。需要找到mongdb的路径,例如:C:\Program Files\MongoDB\Server\4.2\bin,输入mongo,就可以了

之后需要授权,否则会报权限不够:

> use cq
> db.createUser({user:"root",pwd:"123456",roles:[{role:"root",db:"cq"}]})
class MongoPipeline(object):# 实现保存到mongo数据库的类,def __init__(self, mongo_uri, db_name, db_user, db_pass):self.mongo_uri = mongo_uriself.db_name = db_nameself.db_user = db_userself.db_pass = db_pass@classmethoddef from_crawler(cls, crawler):# scrapy 为我们访问settings提供了这样的一个方法,这里,# 我们需要从 settings.py 文件中,取得数据库的URI和数据库名称return cls(mongo_uri=crawler.settings.get('MONGO_URI','localhost'),mongo_db=crawler.settings.get('MONGO_DB','cq'),account = crawler.settings.get('USERNAME','root'),passwd = crawler.settings.get('PWD','123456'))def open_spider(self, spider):  # 爬虫启动时调用,连接到数据库uri = 'mongodb://%s:%s@%s:27017/?authSource=cq' % (self.account, parse.quote_plus(self.passwd),self.mongo_uri)#print(uri)self.client = pymongo.MongoClient(uri)self.db = self.client[self.mongo_db]print(self.mongo_db)def process_item(self, item, spider):collection = 'cqie'  # mongo 数据库的 collection 名字#将item转换成字典item_dict = dict(item)#将数据插入到集合self.db_collecton.insert_one(item_dict)return item # 会在控制台输出原item数据,可以选择不写def close_spider(self, spider):  # 爬虫关闭时调用,关闭数据库连接self.client.close()

爬取结果:

scrapy框架 爬取重庆工程学院相关推荐

  1. scrapy获取a标签的连接_python爬虫——基于scrapy框架爬取网易新闻内容

    python爬虫--基于scrapy框架爬取网易新闻内容 1.需求[前期准备] 2.分析及代码实现(1)获取五大板块详情页url(2)解析每个板块(3)解析每个模块里的标题中详情页信息 点击此处,获取 ...

  2. scrapy框架爬取王者荣耀英雄数据

    scrapy框架爬取王者荣耀英雄属性 爬虫工程 爬虫文件 import scrapy from theKingPro.items import ThekingproItemclass ThekingS ...

  3. 19. python爬虫——基于scrapy框架爬取网易新闻内容

    python爬虫--基于scrapy框架爬取网易新闻内容 1.需求 [前期准备] 2.分析及代码实现 (1)获取五大板块详情页url (2)解析每个板块 (3)解析每个模块里的标题中详情页信息 1.需 ...

  4. 14. python爬虫——基于scrapy框架爬取糗事百科上的段子内容

    python爬虫--基于scrapy框架爬取糗事百科上的段子内容 1.需求 2.分析及实现 3.实现效果 4.进行持久化存储 (1)基于终端指令 (2)基于管道 [前置知识]python爬虫--scr ...

  5. scrapy框架爬取小说

    首先创建相关项目文件,打开cmd输入以下命令: scrapy startproject 项目名称 接着切换到目录文件: cd 项目名称 定义要爬取的网站: scrapy genspider 爬虫名称 ...

  6. 利用python的scrapy框架爬取google搜索结果页面内容

    scrapy google search 实验目的 爬虫实习的项目1,利用python的scrapy框架爬取google搜索结果页面内容. https://github.com/1012598167/ ...

  7. 基于Scrapy框架爬取豆瓣《复联4》影评,并生成词云

    基于Scrapy框架爬取豆瓣<复联4>影评,并生成词云 1. 介绍及开发环境 2. 爬虫实现 2.1 新建项目 2.2 构造请求 2.3 提取信息 2.4 数据存储 2.4 运行结果 3. ...

  8. 03_使用scrapy框架爬取豆瓣电影TOP250

    前言: 本次项目是使用scrapy框架,爬取豆瓣电影TOP250的相关信息.其中涉及到代理IP,随机UA代理,最后将得到的数据保存到mongoDB中.本次爬取的内容实则不难.主要是熟悉scrapy相关 ...

  9. scrapy框架爬取网站图片

    使用scrapy 框架爬取彼岸图库 前言: 这两天在网上学习了一下scrapy框架,发现及其好用,把爬虫步骤分的细细的.所以写了一个简单项目回顾一下并分享给大家^ . ^ 源码我已经放到Github了 ...

最新文章

  1. 猪行天下之Python基础——10.1 Python常用模块(上)
  2. Android studio | From Zero To One ——初级控件(屏幕显示)
  3. java多线程绘图_菜鸟学Java之 Java2D 多线程绘图
  4. extjs 方法执行顺序_TestNG之注解变压器amp;方法拦截器
  5. Qt笔记-拖动文件到QWidget(获取拖动文件路径)
  6. bestcoder #66
  7. [转载] python中import问题
  8. 通过python和websocket构建实时通信系统[扩展saltstack监控]
  9. qq企业邮箱的发送邮件服务器地址,腾讯企业邮箱注册和SMTP发件设置教程
  10. 心理咨询类_微信小程序项目实战、含:标注图、效果图、视频、源码
  11. Android chrome默认设置Autoplay policy
  12. Google Maps的故事,你知道多少?
  13. 人生苦短——珍惜眼前人
  14. Axure RP 8 激活码
  15. 文心一言(中国版ChatGPT)
  16. 高德地图api调用demo_一 (1)高德SDK的使用
  17. Pycharm Setting Python Interpreter
  18. Js核心技术——待补充
  19. 创新实训(2)-Scrapy 学习
  20. 《死亡诗社》中的经典台词

热门文章

  1. 数据库基础篇学习笔记_单行函数
  2. AP5414 0.8-5.5升压恒压 WLED 太阳能电源驱动方案
  3. 寄存器的“地址”概念
  4. 计算机进位计数制实训课教案,进制转换汇报课教案[五篇]
  5. 51单片机定时器及其应用(1)(时钟功能)
  6. 【NOI2008】【BZOJ1061】志愿者招募
  7. samba文件共享(匿名用户共享、本地用户共享、windows+linux系统之间的共享)
  8. RPA自动化流程财务机器人
  9. 光耦隔离驱动芯片的共模瞬变抗扰度和共摸抑制比
  10. R语言计算Roger遗传距离