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. Spark数据倾斜及解决方案

    一.场景 1.绝大多数task执行得都非常快,但个别task执行极慢.比如,总共有100个task,97个task都在1s之内执行完了,但是剩余的task却要一两分钟.这种情况很常见. 2.原本能够正 ...

  2. springmvc复习笔记----springmvc姓名年龄例子:RequestParam 试水

    继续 继上节http://www.cnblogs.com/tk55/p/6652394.html 重要部分颜色突出 结构 包 web.xml 乱码处理方面设置 <url-pattern>* ...

  3. MySQL 8.0.11安装配置

    官网地址:https://dev.mysql.com/downloads/mysql/ 我这里是RHEL6.5的系统,因此选择RedHat 6 x86,64bit操作系统---下载第一个RPM Bun ...

  4. Android开发--Service和Activity通过广播传递消息

    Android的Service也运行在主线程,但是在服务里面是没法直接调用更改UI,如果需要服务传递消息给Activity,通过广播是其中的一种方法: 一.在服务里面发送广播 通过intent传送数据 ...

  5. c/c++ 重载new,delete运算符 placement new

    重载new,delete运算符 new,delete在c++中也被归为运算符,所以可以重载它们. new的行为: 先开辟内存空间 再调用类的构造函数 开辟内存空间的部分,可以被重载. delete的行 ...

  6. python 中文报错

    解决的办法为:在程序的开头写入如下代码,这就是中文注释 #coding=utf-8

  7. Windows Server 2016-Active Directory域服务端口汇总

    本章为大家简单整理一下有关Windows server Active Directory和Active Directory域服务(AD DS)组件的端口要求.生产环境中我们在做网络调整.防火墙或者开关 ...

  8. Linux Rsyslog日志集中管理

    Linux Rsyslog日志集中管理 一.Rsyslog简介 ryslog 是一个快速处理收集系统日志的程序,提供了高性能.安全功能和模块化设计.rsyslog 是syslog 的升级版,它将多种来 ...

  9. SSH File Transfer遇到错误"too many authentication failures for root".A protocol error was detected......

    在SSH  Secure Shell 连接Linux centos的时候,遇到F-Secure SSH File Transfer错误"too many authentication fai ...

  10. 【PS技巧】如何校正倾斜的图片

    1.打开PS,直接拖拽图片. 2.点击[滤镜==>扭曲==>镜头校正],出现校正对话框. 3.点击拉直工具,从右向左滑一条直线. 参考文档: 在Photoshop中如何校正倾斜的图片?