scrapy框架流程
创建项目
scrapy startproject Tencent (Tencent项目名)
py文件类别
创建爬虫文件模板
到项目路径下 D:\scrapy\Tencent>scrapy genspider tancent tancent.com
运行 scrapy genspider tancent tancent.com (tancent.com对应的域名)
启动项目在对应的文件夹下
第一种输入:scrapy crawl name (name是项目的名字)
第二种启动:创建run.py
在run中输入
from scrapy import cmdline
cmdline.execute('scrapy crawl baidu'.split())
流程图
Scrapy 选择器
选择器提供
2
个方法来提取标签
xpath()
基于
xpath
的语法规则
css()
基于
css
选择器的语法规则
快捷方式
response.xpath()
response.css()
它们返回的选择器列表
提取文本:
selector.extract()
返回文本列表
selector.extract_first()
返回第一个
selector
的文本,没有返回
None
selector.get()
selector.getall()
嵌套选择器
有时候我们获取标签需要多次调用选择方法(
.xpath()
或
.css()
)
response.css('img').xpath('@src')
Selector
还有一个
.re()
方法使用正则表达式提取数据的方法。
它返回字符串。
它一般使用在
xpath()
,
css()
方法之后,用来过滤文本数据。
re_first()
用来返回第一个匹配的字符串。
日志器
日志文件配置
LOG_FILE
日志输出文件,如果为
None
,就打印在控制台
LOG_ENABLED
是否启用日志,默认
True
LOG_ENCODING
日志编码,默认
utf-8
LOG_LEVEL
日志等级,默认
debug
LOG_FORMAT
日志格式
%(levelno)s
打印日志级别的数值
%(levelname)s
打印日志级别名称
%(pathname)s
打印当前执行程序的路径,其实就是
sys.argv[0]
%(filename)s
打印当前执行程序名
%(funcName)s
打印日志的当前函数
%(lineno)d
打印日志的当前行号
%(asctime)s
打印日志的记录时间
%(thread)d
打印线程
ID
%(threadName)s
打印线程的名称
%(process)d
打印进程的
ID
%(message)s
打印日志的信息
LOG_DATEFORMAT
日志日期格式
LOG_STDOUT
日志标准输出,默认
False
,如果
True
所有标准输
出都将写入日志中
LOG_SHORT_NAMES
短日志名,默认为
False
,如果
True
将不输出
组件名
项目中一般设置:
LOG_FILE
= 'logfile_name'
LOG_LEVEL
= 'INFO'
次级页面提取
Scrapy.http.Request
类是
scrapy
框架中
request
的基类。它的参数如
下:
from
scrapy
.
http
import
Request
,
FormRequest
Request
def parse(self, response):
# 在parse 中我们只需要关注怎么解析就行,因为response这个对象就有xpath属性
node_list = response.xpath('//div[@class="info"]')
if node_list:
for i in node_list:
# 标题
movie_title = i.xpath('./div/a/span/text()').get()
# 导演
director = i.xpath('./div/p/text()').get().strip().replace(' ', ' ')
# 分数
score = i.xpath('.//span[@class="rating_num"]/text()').get()
tong = {}
tong['movie_title'] = movie_title
tong['director'] = director
tong['score'] = score
# 电影详情页
detail_url = i.xpath('./div/a/@href').get()
yield scrapy.Request(detail_url, callback=self.get_detail, meta={"info":tong})
# {"info":{"movie_title":"肖生克的救赎",'director':'导演的信息','score':'9.7'}}
self.page+=1
page_url = 'https://movie.douban.com/top250?start={}&filter='.format(self.page*25)
yield scrapy.Request(page_url,callback=self.parse)
else:
return
# 专门负责解析详情页的内容(次级页面解析函数)
def get_detail(self, response):
item = MySpiderItem()
info = response.meta.get("info")
item.update(info)
desc = response.xpath('//span[@property="v:summary"]/text()').get().strip()
item['desc'] = desc
yield item
url
(字符串)
-
此请求的
URL
callback
(
callable
)
-
回调函数
method
(
string
)
-
此请求的
HTTP
方法。默认为
'GET'
。
meta
(
dict
)
- Request.meta
属性的初始值。
body
(
str
或
unicode
)
-
请求体。如果没有传参,默认为空字符
串。
headers
(
dict
)
-
此请求的请求头。
cookies
(dict / [dict])-
请求
cookie
。
encoding
(字符串)
-
此请求的编码(默认为
'utf-8'
)此编码将用
于对
URL
进行编码并将
body
转换为
bytes
(如果给定
unicode
)。
priority
(
int
)
-
此请求的优先级(默认为
0
)
,
数字越大优先级越
高。
dont_filter
(
boolean
)
-
表示调度程序不应过滤此请求。
errback
(
callable
)
-
在处理请求时引发任何异常时将调用的函
数。
flags
(
list
)
-
发送给请求的标志,可用于日志记录或类似目的
cb_kwargs
(dict) -
回调函数的参数值
---------------------------------------------------------------------------=
FormRequest
get
请求和
post
请求是最常见的请求。
scrapy
框架内置了一个
FormRequest
类
它扩展了基类
Request
,具有处理
HTML
表单的功能。
在使用
scrapy
发动
POST
请求的时候
,
常使用此方法
,
能较方便的发送请
求
.
具体的使用
,
url
(字符串)
-
此响应的
URL
status
(整数)
-
响应的
HTTP
状态。默认为
200
。
headers
(
dict
)
-
此响应的响应头。
dict
值可以是字符串(对于单值
标头)或列表(对于多值标头)。
body
(字节)
-
响应主体。要将解码后的文本作为
str
(
Python 2
中的
unicode
)访问,您可以使用
response.text
来自编码感知的
Response
子类,例如
TextResponse
。
flags
(列表)
-
是包含
Response.flags
属性初始值的列表 。如果给
定,列表将被浅层复制。
request
(
Requestobject
)
- Response.request
属性的初始值。这表
示
Request
生成此响应的内容。
属性和方法
url
包含此请求的
URL
的字符串。该属性是只读的。更改请求使用的
URL replace()
。
method
表示请求中的
HTTP
方法的字符串。
headers
类似字典的对象,包含请求头。
body
包含请求正文的
str
。该属性是只读的。更改请求使用的
URL
replace()
。
meta
包含此请求的任意元数据的字典。
copy()
返回一个新的请求,该请求是此请求的副本。
replace
(
[ URL
,
method
,
headers
,
body
,
cookies
,
meta
, encoding,
dont_filter
,
callback
,
errback]
) 返回一个更新对的 request
分布式爬蟲
方法1(正常寫)
管道配置
(记得不管存在哪都要return item)
开启管道
配置settings
方法2(red_key方法)
继承redis的类
存入kes启动爬虫