spider数据挖掘-----6、scrapy框架(二)

一、次级页面获取及数据传递拼接:(之前都是抓取一级页面)
次级页面和一级页面不在一个页面上,次级页面是在一级页面跳过超链接进入的另一个页面
数据不存储在本地,用管道进行存储
到达次级页面网页的连接,可以从一级页面的源代码中寻找
次级页面的电影详情不能再通过一级页面解析方法进行解析了callback="self.get_detail"重设解析方法
每个次级页面详情所在标签位置都不一样,把拥有相同父标签的路径改成//全局搜索,并且是要span的准确属性@property=”v:summary“
设立多个解析方法,解析的顺序是没有的(异步,谁都不管谁),保证了效率

存储问题:数据没有次序,需要使用meta传参,保证同一个电影的信息在一起,
在detail的url请求中可加入meta={”info(随便设的键名)“:item_pipe(表示需要跟随的数据)},
这里表示跟随数据后,电影名称数据传入管道接着meta就收到信息,然后指定另一个解析函数也要将电影详情接入到电影信息中的准确位置去
item=DbItem()
info=response.meta(“info”)
item.update(info)主要是update方法能让电影详情准确接入电影信息后,属于管道引用update方法
引擎中的会指定meta跟着得到的response数据一起传给爬虫解析,通过解析函数的response.meta接收
yield不仅仅是起循环作用,还是起返回达到把数据传给管道进行保存的作用‘yield一次’就是发送给’item=Dbitem一次‘
电影信息的yield传到管道的过程中放到引擎中,等到meta回来拿到url和解析好的数据再给爬虫解析,然后再全部一起发回给引擎再一同放到管道

设计:
目标数据:电影信息+电影简介
请求流程:访问一级页面,提取电影信息+次级页面url,访问次级页面url从中提取数据

二、Scrapy shell
用来调试Scrapy 项目代码的 命令行工具。
启动的时候预定义了Scrapy的一些对象

启动 shell
启动Scrapy shell的命令语法格式如下:

scrapy shell [option] [url或file]

url 就是你想要爬取的网址

注意:分析本地文件是一定要带上路径,scrapy shell默认当作url

shell 的使用
Scrapy shell 本质上就是个普通的python shell
只不过提供了一些需要使用的对象,快捷方法便于我们调试。

快捷方法:(Useful shortcuts)
shelp():列出命令

fetch(url[,redirect=True]):拉取,通过url获取response
在首页时获取其他页面的数据,url填其他页面的url,redirect是默认操作

fetch(request):拉取,通过请求对象获取response

view(response):显示出response界面,需要在本地浏览器环境下使用

scrapy 对象:
crawler
spider
request
response
settings

三、Scrapy选择器
Scrapy提供基于lxml库的解析机制,它们被称为选择器(bs4、xpath、css、正则表达式)
因为,它们“选择”由XPath或CSS表达式指定的HTML文档的某部分。
Scarpy选择器的API非常小,且非常简单。

先导出selector对象,
from scrapy.selector import selector
1、通过text参数来构造对象(在文本上构造)
然后selector对象,通过text参数来构造
selc_text=selector(text(通过text参数来构造对象)=html_str)这个相当于response对象
print(selc_text.extract() ),得到用html和body包裹的对象,如果已有html和body则不添加
print(selc_text.extract(’//div/~~~‘) )也可以输入标签进行提取
print(selc_text.xpath(’//div[@class=“info”]//div/a/span/text()’).extract())

在xpath选择器下解析然后再.extract()进行提取
2、通过response构造selector对象(在响应上构造)
from scrapy.http import HtmlResponse
response=HtmlResponse(url=”http~~~“,body=html_str(和上面一样放入一个文本),encoding=’utf-8‘)(body这需要一个字节串))
response1=Selector(response(通过response构造selector对象)=response)
print(response.Selector(可省略).xpath(’//div[@class=“info”]//div/a/span/text()’).extract())
嵌套表达式:用css选择器之后再用一个选择器,进行过滤
selector对象可以任意使用css和xpath,因为css和xpath得到的不是数据而re得到的是一个数据,所以用re之后就不能用css和xpath了
如果想re和css一起用,可以把re留在最后使用,但re属于提取成数据了,所以不用再加
print(response.css(”a“).xpath(’./span【1】/text()‘))
css能更快进行提取标签,可以不用考虑太多路径问题,然后xpath就可以使用读取文本进行提取数据
css提取标签元素,xpath遍历数据(不是数据,加text后是数据转生成器,在scrapy下用get提取,在selector类下用extract提取)
re直接提取完整数据后已经不再是selector对象了,不用再进行处理也无法于其他选择器再转换

构造选择器
Scrapy选择器是通过scrapy.Selector类,
通过传递文本或者TextResonse对象构造的实例。

它会根据输入类型自动选择最佳解析规则
XML与HTML

使用选择器
选择器提供2个方法来提取标签
xpath() 基于xpath的语法规则
css() 基于css选择器的语法规则
快捷方式
response.xpath()
response.css()
它们返回的选择器列表

提取文本:
selector.extract() 返回文本列表
selector.extract_first() 相当于selector.extract()【0】返回第一个selector的文本,没有返回None

嵌套选择器
有时候我们获取标签需要多次调用选择方法(.xpath()或.css())
response.css(‘img’).xpath(’@src’)

它的原理见左图案例:

Selector还有一个.re()方法使用正则表达式提取数据的方法。
它返回字符串。
它一般使用在xpath(),css()方法之后,用来过滤文本数据。
re_first()用来返回第一个匹配的字符串。
例如:
response.xpath(’//a[contains(@href, “image”)]/text()’).re(r’Name:\s*(.*)’)

四、scrapy. Spider

yield内在循环,在for循环中起到小部分的内在循环

猜你喜欢

转载自blog.csdn.net/qwe863226687/article/details/114117022
今日推荐