miss美人镇贴
- 安装 pip install scrapy
-
框架结构:
引擎:
负责信号和数据的传递,起协调作用。 (自动实现)调度器:
会将request对象储存在任务队列中,引擎会从任务队列里提取任务,交给下载器。 (框架实现)spider爬虫文件:
通过起始url发起request请求,解析响应结果,1. 提取新的url,2. 提取数据。 (手动实现)下载器:
接受引擎传递过来的请求,发起请求,获取响应,最终将响应结果通过中间件、引擎等提交给spider爬虫文件。 (框架实现)管道文件:
将spider爬虫文件yeild的item数据,做过滤和持久化。 (手动实现)下载中间件:
自定义下载组件(请求结果和响应结果都会经过中间件)。 (特殊需求手动实现)spider爬虫中间件:
可以自定义requset请求,过滤response请求。 (特殊需求手动实现)还有代理中间件,cookie中间件,User-Agent中间件,selenium中间件等。
1.0如何写一个项目呢?
创建项目:scrapy startproject 项目名称
创建爬虫文件:
1. 进入爬虫文件夹下
2. scrapy genspider 爬虫名称 域
Spider
|- scrapy.cfg 项目部署文件
|- Spider 该项目的python模块,可以在这里加入代码
|- __init__.py
|- items.py 主要是将爬取的非结构性的数据源提取结构性数据
|- middlewares.py
|- pipelines.py 将爬取的数据进行持久化存储
|- __pycache__
|- settings.py 配置文件
|- spiders 放置spider代码的目录
|- __init__.py
|- __pycache__
1.1创建爬虫模块
import scrapy
class Spider(scrapy.Spider): #创建的Spider是继承scrapy.Spider类
name = "Spider" #爬虫的名称(必须是项目里面唯一的)
allowed_domain = ["xxx.com"] #允许的域名(就是这个爬虫爬取链接的范围)
start_urls = ["http://xxx.com/xxx/xxx"] #开始爬取的链接
def parse(self, response):
pass
内部框架的py文件以及作用:
- spider文件夹下存放爬虫文件
- item.py :根据目标网站,定义需要的字段
- pipeline:做数据的过滤和持久化
- middleware:中间件
- settings.py:设置文件,在里面做User-Agent的配置,Headlers,激活管道文件等等
- scrapy.cfg:配置文件,一般情况下,作部署时会用到它
1.2框架的操作步骤,很简单哟
step1:
分析目标网站,根据要提取的目标数据在items.py中创建字段
step2:
(1)在爬虫文件中设置目标url
(2)解析请求成功的响应结果,提取目标数据,赋值给item,提取url继续发起请求
step3:
(1)setting下激活管道
(2)在管道文件中做数据的过滤和持久化
2.1图片下载:
第一种: 正常的发起请求,正常的获取二进制文件,保存
第二种: 自定义图片管道,继承自ImagePipeline.py
重写方法:
def get_media_request,item,spider...
# 获取图片地址,发起请求
def item_completed(self,results,spider,item...)
# 在results结果中,根据图片下载状态,获取图片本地路径
# 将获取的路径赋值给item,然后将item返回给其他管道
2.2scrapy shell 交互是终端的使用
1. scrapy shell "http://hr.tencent.com/position.php?&start=0#a" 进入网站
2. view(response) 查看响应
3. response.css('td.l.square a::text') 查看a标签的文本信息
4. response.css('td.l.square a::text').extract() 查看a标签的文本信息 只看文本
5. response.css('td.l.square a::attr(href)').extract() 查看a标签的href属性
2.3scrapy.Spider
customer_settings:
def star_requests():
# 根据起始url,发起请求
def parse(self,response):
# 得到响应的回调函数
2.4选择对象有四个基本的方法
- xpath(query):传入XPath表达式查询,返回该表达式所对应的所有节点的选择器列表列表
- css(查询):传入CSS表达式查询,返回该表达式所对应的所有节点的选择器列表列表
- extract():序列化该节点为Unicode字符串并返回列表列表。
- re(正则表达式):根据传入的正则表达式对数据进行提取,返回的Unicode字符串列表.regex可以是一个已编译的正则,也可以是一个将为re.compile(正则表达式)编译为正则表达式的字符串。
2.5 item
Scrapy提供Item类。 Item对象是用于收集所抓取的数据的简单容器。它们提供了一个类似字典的 API,具有用于声明其可用字段的方便的语法
在items.py文件输入
class SpiderItem(scrapt.Item):
url = scrapy.Field()
time = scrapy.Field()
title = scrapy.Field()
content = scrapy.Field()
如果需要扩展的话,这样的方法扩展
class newSpiderItem(SpiderItem):
xxx = scrapy.Field()
2.6 Item Pipeline
当item在Spider中被传递后,它将会传递到Item PipeLine,利用Item PipeLine来进行数据保存
先上示例代码:
from scrapy.exceptions import DropItem
class SpiderPipeline(object):
def __init__(self):
self.file = open('xxx.html','w')
def process_item(self,item,spider):
if item['title']:
file = (dict(item)) + "\n"
self.file.write(file)
return item
else:
raise DropItem("没有找到标题"+title)
class 自定义管道(object):
def __init__(self):
# 可以在这里设置参数(比如,创建数据库连接,打开文件等)
def open_spider(self,spider):
# 爬虫开启的时候会调用,可选方法
@classmethod
def from_crawler(cls,crawler):
# crawler:包含了爬虫的核心组件
# 可以获取setting的一些设置参数
return cls(...)
def process_item(self,item.spider):
# 所有yield中的item都会经过这个方法
# 在这里做数据持久化(PyMySQL,PyMongo)
多个item时处理方法1 :
if isinstance(item,类名): # 类名不需要加引号
# 根据不同的item,做不同的判断
elif isinstance(item,类名): # 类名不需要加引号
多个item时处理方法2 :
1. 在item对应的类中,定义一个方法,返回sql语句和要插入的数据
2. 使用item调用这个方法,得到sql语句和要插入的数据
3. 执行插入语句
return item # 如果要将item传递给下一个管道,必须要将item return 回去
def close_spider(self.spider):
# 爬虫结束时调用
# 在这里关闭数据库链接,关闭文件等
之后在setting.py的ITEM_PIPELINES中进行激活
ITEM_PIPELINES = {
'Spider.pipelines.spiderPipeline':299}
process_item()方法可以用来判断是来自于哪个爬虫,item是被爬取对象,spider是爬取该item的Spider
Dropitem是一个错误捕获
299是判断运行顺序,范围为0~1000,数字越低优先级越高
通用爬虫
通过下面的命令可以快速创建 CrawlSpider模板 的代码:
scrapy genspider -t crawl 爬虫文件 域名
LinkExtractor的参数:
allow:
一般跟一个正则表达式 表示提取url 重用!!!
deny:
同样是者正则表达式,符合表达式的链接(优先级比allow高)
allowed_domains:
必须在我设置的域名下提取链接
deny_domains:
不会在deny_domains设置的域名下提取链接
restrict_xpath:
提取链接的时候,通过xpath语法定位到某些标签,提取标签下符合规则的链接 重用!!!
attrs:
可以指定要提取标签的某些属性
restrict_css:
提取链接的时候,通过css语法定位到某些标签,提取标签下符合规则的链接 重用!!!
网友评论