01-scrapy介绍

02-项目的目录结构:

scrapy.cfg   项目的主配置信息。(真正爬虫相关的配置信息在settings.py 文件中)

items.py    设置数据存储模板,用于结构化数据,如:Django的model

pipelines    数据持久化处理

settings.py 配置文件

spiders      爬虫目录,如:创建文件,编写爬虫解析规则

03-配置文件settings.py的配置

# 建议修改:
ROBOTSTXT_OBEY = False # 默认为True # 进行身份伪装
USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"

04-创建项目和爬虫文件

# 创建项目
scrapy startproject firstScrapy # 先切换到项目文件里
cd firstScrapy/ # 然后执行创建
scrapy genspider first www.qiushibaike.com

05-执行

# 执行爬取程序, first 为爬虫文件名称

scrapy crawl first

# 此方式是阻止日志信息的输出
scrapy crawl first --nolog

06-基于终端指令的持久化存储

持久化存储操作:
a.磁盘文件
a)基于终端指令
i.保证parse方法返回一个可迭代类型的对象(存储解析到的页面内容)
ii.使用终端指令完成数据存储到制定磁盘文件中的操作
1.scrapy crawl 爬虫文件名称 –o 磁盘文件.后缀
b)基于管道
i.items:存储解析到的页面数据
ii.pipelines:处理持久化存储的相关操作
iii.代码实现流程:
1.将解析到的页面数据存储到items对象
2.使用yield关键字将items提交给管道文件进行处理
3.在管道文件中编写代码完成数据存储的操作
4.在配置文件中开启管道操作 b.数据库
a)mysql
b)redis
c)编码流程:
1.将解析到的页面数据存储到items对象
2.使用yield关键字将items提交给管道文件进行处理
3.在管道文件中编写代码完成数据存储的操作
4.在配置文件中开启管道操作 需求:将爬取到的数据值分别存储到本地磁盘、redis数据库、mysql数据。
1.需要在管道文件中编写对应平台的管道类
2.在配置文件中对自定义的管道类进行生效操
# 案例:
# firstScrapy/spiders/first.py # -*- coding: utf-8 -*-
import scrapy class FirstSpider(scrapy.Spider):
# 爬虫文件的名称name
name = 'first'
# 允许的域名:只允许爬取当前域名下的页面数据
# allowed_domains = ['www.qiushibaike.com/text/'] # 起始的url:当前工程所要爬取的页面所对应的url
# 注意:start_urls 是 allowed_domains 下的页面的url
start_urls = ['https://www.qiushibaike.com/text/'] # 解析方法:对获取的页面数据进行指定内容的解析
# response:请求成功后返回的响应对象
# parse 方法的返回值,必须为迭代器 或者为 空None
def parse(self, response):
# 建议大家用xpath 进行指定内容的解析(框架集成了xpath解析的接口)
# 获取段子的内容和作者
div_list = response.xpath('//div[@id="content-left"]/div') # 存储解析到的页面数据
data_list = []
for div in div_list:
# xpath解析到的指定内容被存储到 Selector对象
# extract() 该方法可以将 Selector对象 中存储的数据值拿到
# author = div.xpath('./div/a[2]/h2/text()').extract()[0]
# extract_first() == extract()[0]
author = div.xpath('./div/a[2]/h2/text()').extract_first()
content = div.xpath('.//div[@class="content"]/span/text()').extract_first()
dict_data = {
'author': author,
'content': content
}
data_list.append(dict_data) return data_list
# 在终端执行命令:(在first爬虫文件下)

scrapy crawl first -o qiubai.csv --nolog

07-基于管道的持久化存储

# 修改配置文件settings.py
# 打开注释
ITEM_PIPELINES = {
'firstScrapy.pipelines.FirstscrapyPipeline': 300,
}
# firstScrapy/first.py

# -*- coding: utf-8 -*-
import scrapy
from firstScrapy.items import FirstscrapyItem class FirstSpider(scrapy.Spider):
# 爬虫文件的名称name
name = 'first'
start_urls = ['https://www.qiushibaike.com/text/'] def parse(self, response):
# 获取段子的内容和作者
div_list = response.xpath('//div[@id="content-left"]/div') for div in div_list:
author = div.xpath('./div/a[2]/h2/text()').extract_first()
content = div.xpath('.//div[@class="content"]/span/text()').extract_first() # 1.将解析到的数据值(author和content)存储到items对象中
item = FirstscrapyItem()
item['author'] = author
item['content'] = content # 2.将item对象提交给管道
yield item
# firstScrapy/items.py

import scrapy

class FirstscrapyItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
author = scrapy.Field()
content = scrapy.Field()
# firstScrapy/pipelines.py

class FirstscrapyPipeline(object):
fp = None
# open_spider 在整个爬虫过程中,该方法只会在开始爬虫的时候,被调用一次! def open_spider(self, spider):
print("开始爬虫")
self.fp = open('./qiubai_pipe.txt', 'w', encoding='utf-8') # 3.在管道文件中编写代码完成数据储存的操作
# process_item 该方法就可以接受爬虫文件中提交过来的item对象,并且对item对象中存储的页面数据进行持久化存储
# 参数:item 表示的是 接收到的item对象
# 每当爬虫文件向管道提交一次item,则该方法就会被执行一次! def process_item(self, item, spider):
# 取出item对象中存储的数据值
author = item['author']
content = item['content'] # 持久化存储
self.fp.write(author + ':' + content + '\n\n\n') return item # 只会在爬虫结束的时候,被调用一次! def close_spider(self, spider):
print('爬虫结束!')
self.fp.close()

08-基于MySQL的持久化存储

# pipelines.py

import pymysql

class FirstscrapyPipeline(object):
conn = None
cursor = None def open_spider(self, spider):
print("爬虫开始!")
# 链接数据库
self.conn = pymysql.Connect(host='127.0.0.1', port=3306, user='root', passwd='', db='qiubai') # 编写向数据库中存储数据的相关代码 def process_item(self, item, spider):
# 1.连接数据库
# 2.执行sql语句
sql = 'insert into qiubai values("%s", "%s")' % (item['author'], item['content'])
self.cursor = self.conn.cursor()
try:
self.cursor.execute(sql) # 3.提交事务
self.conn.commit()
except Exception as e:
print(e)
self.conn.rollback() # 取出item对象中存储的数据值
author = item['author']
content = item['content'] return item def close_spider(self, spider):
print("爬虫结束!")
self.cursor.close()
self.conn.close()

09-基于redis的持久化存储

# pipelines.py

import redis

class FirstscrapyPipeline(object):
conn = None
cursor = None def open_spider(self, spider):
print("爬虫开始!")
# 链接redis数据库
self.conn = redis.Redis(host='127.0.0.1', port=6379) # 编写向数据库中存储数据的相关代码 def process_item(self, item, spider):
dict_data = {
'author': item['author'],
'content': item['content'],
}
self.conn.lpush('data', dict_data) return item

10-管道的高级操作

# 修改配置文件settings.py

ITEM_PIPELINES = {
'firstScrapy.pipelines.FirstscrapyPipeline': 300,
'firstScrapy.pipelines.FirstByFiles': 200,
'firstScrapy.pipelines.FirstByMysql': 400,
}
# 需求:将爬取到的数据值分别存储到本地磁盘、redis数据库、mysql数据。
1.需要在管道文件中编写对应平台的管道类
2.在配置文件中对自定义的管道类进行生效操作 # pipelines.py import redis
import pymysql class FirstscrapyPipeline(object):
conn = None
cursor = None def open_spider(self, spider):
print("爬虫开始!")
# 链接redis数据库
self.conn = redis.Redis(host='127.0.0.1', port=6379) # 编写向数据库中存储数据的相关代码 def process_item(self, item, spider):
dict_data = {
'author': item['author'],
'content': item['content'],
}
self.conn.lpush('data', dict_data) return item # 实现将数据值存储到本地磁盘中
class FirstByFiles(object):
def process_item(self, item, spider):
print('数据已经写入指定的磁盘文件中')
return item class FirstByMysql(object):
def process_item(self, item, spider):
print('数据已经写入到MySQL数据库中') return item

11-就多个url的数据爬取

# 解决方案:请求的手动发送
# spider.py/qiubai.py # -*- coding: utf-8 -*-
import scrapy
from qiubaiByPages.items import QiubaibypagesItem class QiubaiSpider(scrapy.Spider):
name = 'qiubai'
# allowed_domains = ['www.qiushibaike.com/text']
start_urls = ['https://www.qiushibaike.com/text/'] # 设计一个通用的url模板
url = 'https://www.qiushibaike.com/text/page/%d/'
pageNum = 1 def parse(self, response):
div_list = response.xpath('//*[@id="content-left"]/div') for div in div_list:
author = div.xpath('./div[@class="author clearfix"]/a[2]/h2/text()').extract_first()
content = div.xpath('.//div[@class="content"]/span/text()').extract_first() item = QiubaibypagesItem()
item['author'] = author
item['content'] = content yield item
# 请求的手动发送
if self.pageNum <= 13:
print('爬取了第%s的页面数据!' % self.pageNum)
self.pageNum += 1
new_url = format(self.url % self.pageNum)
# callback 将请求获取的页面数据进行解析
yield scrapy.Request(url=new_url, callback=self.parse)

爬虫(二)之scrapy框架的更多相关文章

  1. 第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码

    第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码 打码接口文件 # -*- coding: cp936 -*- import sys import os ...

  2. 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

    第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...

  3. 第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies

    第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录 模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于star ...

  4. 第三百三十二节,web爬虫讲解2—Scrapy框架爬虫—Scrapy使用

    第三百三十二节,web爬虫讲解2—Scrapy框架爬虫—Scrapy使用 xpath表达式 //x 表示向下查找n层指定标签,如://div 表示查找所有div标签 /x 表示向下查找一层指定的标签 ...

  5. 第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令

    第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令 Scrapy框架安装 1.首先,终端执行命令升级pip: python -m pip install --u ...

  6. Python爬虫进阶之Scrapy框架安装配置

    Python爬虫进阶之Scrapy框架安装配置 初级的爬虫我们利用urllib和urllib2库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架Scrapy,这安装过程也是煞费苦心哪,在此 ...

  7. 十二 web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies

    模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于start_urls,start_requests()返回的请求会替代start_urls里 ...

  8. 爬虫基础(五)-----scrapy框架简介

    ---------------------------------------------------摆脱穷人思维 <五> :拓展自己的视野,适当做一些眼前''无用''的事情,防止进入只关 ...

  9. python爬虫学习之Scrapy框架的工作原理

    一.Scrapy简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了 页面抓取 (更确切来说, 网 ...

随机推荐

  1. 关于getdate()的不同的日期格式

    在使用Sql Server查询数据库时,我们经常会需要查询日期格式的数据,对于日期在sql语言中的格式有一定的要求,通过修改convert中的最后一位参数,可以返回不通格式的时间,具体实现如下: Se ...

  2. 用emacs 阅读 c/c++ 代码

    在emacs编程中有以下需求 从调用一个函数的地方跳转到函数的定义的地方 或是反过来从函数定义的地方列出所有调用这个函数的地方 实现办法 需要安装以下软件 gnu global(阅读源代码的工具)官网 ...

  3. GET vs. POST

    GET 和 POST 都创建数组(例如,array( key => value, key2 => value2, key3 => value3, ...)).此数组包含键/值对,其中 ...

  4. Vue学习之路8-v-on指令学习简单事件绑定之属性

    前言 上一篇文章以v-on指令绑定click事件为例介绍了v-on指令的使用方法,本文介绍一下v-on绑定事件的一些属性的使用方法. v-on绑定指令属性 .stop属性 阻止单击事件继续向上传播(简 ...

  5. MySQL高级知识(二)——Join查询

    前言:该篇主要对MySQL中join语句的七种情况进行总结. 0.准备 join主要根据两表或多表之间列的关系,从这些表中进行数据的查询. 首先创建两张表:tb_emp(员工表)和tb_dept(部门 ...

  6. [BZOJ 2759] 一个动态树好题

    [BZOJ 2759] 一个动态树好题 题目描述 首先这是个基环树. 然后根节点一定会连出去一条非树边.通过一个环就可以解除根的答案,然后其他节点的答案就可以由根解出来. 因为要修改\(p_i\),所 ...

  7. Scrapy 框架 分布式 爬虫

    分布式 爬虫 scrapy-redis 实现 原生scrapy 无法实现 分布式 调度器和管道无法被分布式机群共享 环境安装 - pip install scrapy_redis 导包:from sc ...

  8. 因PHP漏洞,超过4.5万个中国网站被攻击

    因PHP漏洞,超过4.5万个中国网站被攻击 日前据外媒ZDNet了解,超过4.5万个中国网站受到了试图进入网络服务器的不法分子攻击. 此次黑客利用中国网络安全公司VulnSpy在ExploitDB上发 ...

  9. Integer判断大于 == 127时的坑

    在一次判断返回Interger类型的code,  用==结果, 没进去 Integer的值在-128到127时,Integer对象是在IntegerCache.cache产生,会复用已有对象,也就是说 ...

  10. dubbo远程方法调用的基本原理

    1 dubbo是远程服务调用rpc框架 2 dubbo缺省协议采用单一长连接和NIO通讯 1client端生成一个唯一的id,封装方法调用信息obj(接口名,方法名,参数,处理结果的回调对象),在全局 ...