mirror of
https://github.com/Estom/notes.git
synced 2026-04-13 18:00:27 +08:00
python
This commit is contained in:
20
Python/Scrapy/Scrapy框架学习——ItemLoaders.md
Normal file
20
Python/Scrapy/Scrapy框架学习——ItemLoaders.md
Normal file
@@ -0,0 +1,20 @@
|
||||
**ItemLoader是为了将获取文本进行分解,装载到相应的ItemLoader当中。**
|
||||
|
||||
**具体方法:**
|
||||
|
||||
**def** **parse**(self, response): l **=** ItemLoader(item**=**Product(),
|
||||
response**=**response) l**.**add_xpath('name', '//div[@class="product_name"]')
|
||||
l**.**add_xpath('name', '//div[@class="product_title"]')
|
||||
l**.**add_xpath('price', '//p[@id="price"]') l**.**add_css('stock', 'p\#stock]')
|
||||
l**.**add_value('last_updated', 'today') *\# you can also use literal values*
|
||||
**return** l**.**load_item()
|
||||
|
||||
ItemLoader在每个字段中包含了一个输入处理器和一个输出处理器。
|
||||
|
||||
输入处理器收到数据时,理科提取数据,通过add_xpath(),add_css(),add_value()方法
|
||||
|
||||
之后输入处理器的结果被手气起来并保存到ItemLoader内。
|
||||
|
||||
收集到所有的数据后,调用ItemLoader.load_item()方法来填充,并得到填充后的Item对象。
|
||||
|
||||
这是当输出处理器和之前手机到的数据被调用。数据的结果是被分配多啊Item的最终值。
|
||||
6
Python/Scrapy/Scrapy框架学习——Items使用.md
Normal file
6
Python/Scrapy/Scrapy框架学习——Items使用.md
Normal file
@@ -0,0 +1,6 @@
|
||||
\>
|
||||
准确的说,scrapy主要就有两部分可以编辑,一个使用来处理数据的scrapy.Items,另一个用来仓库
|
||||
|
||||
Item的操作包括创建、获取字段的值、设置字段的值、后去所欲的键、获取product列表、获取product字段、社赋值和浅复制、集成扩展item。
|
||||
|
||||
Item对象的操作 fields内置字段,是item生命中使用到的field对象的名字,是一个字典。
|
||||
65
Python/Scrapy/Scrapy框架学习——命令行工具.md
Normal file
65
Python/Scrapy/Scrapy框架学习——命令行工具.md
Normal file
@@ -0,0 +1,65 @@
|
||||
全局命令\<不需要要项目,在命令行中直接运行\>:
|
||||
|
||||
scrapy startproject myproject
|
||||
|
||||
\- 创建一个名为myproject的scrapy项目
|
||||
|
||||
scrapy genspider [-t template] \<name\> \<domain\>
|
||||
|
||||
\- 创建一个新的spider(-l 列出spider的模板,-d 查看模板的内容 -t 使用这个模板)
|
||||
|
||||
scrapy -h
|
||||
|
||||
\- 查看所有可用的命令
|
||||
|
||||
scrapy crawl \<spider\>
|
||||
|
||||
\- 使用spider进行爬虫
|
||||
|
||||
scrapy check [l] \<spider\>
|
||||
|
||||
\- 运行contract检查
|
||||
|
||||
scrapy list
|
||||
|
||||
\- 列出所欲可能的spider
|
||||
|
||||
scrapy edit \<spider\>
|
||||
|
||||
\- 使用设定的编辑器编辑spider
|
||||
|
||||
scrapy fetch \<url\>
|
||||
|
||||
\- 使用scrapy下载器Downloader下载给定的URL,并将获取到的内容标准输出
|
||||
|
||||
scrapy view \<url\>
|
||||
|
||||
\- 用来查看spider获取到的页面,因为可能spider获取到的页面跟想要的不同。
|
||||
|
||||
scrapy shell [url]
|
||||
|
||||
\-scrapy 终端,能够使用scrapy内部命令对url返回的内容进行操作。
|
||||
|
||||
scrapy parse \<url\> [options]
|
||||
|
||||
\- 获取给定的URL并使用相应的spider分析处理。
|
||||
|
||||
scrapy settings [options]
|
||||
|
||||
\- 获取scrapy的设定。
|
||||
|
||||
scrapy runspider \<spider_file.py\>
|
||||
|
||||
\- 在未创建项目的情况下,运行在一个编写在python文件中的spider
|
||||
|
||||
scrapy -version [-v]
|
||||
|
||||
\- 输出scrapy版本
|
||||
|
||||
scrapy deploy []
|
||||
|
||||
\- 将仙姑部署到scrapyd服务。
|
||||
|
||||
scrapy bench
|
||||
|
||||
\- 运行benchmark测试。
|
||||
44
Python/Scrapy/Scrapy框架学习——琐碎知识整理.md
Normal file
44
Python/Scrapy/Scrapy框架学习——琐碎知识整理.md
Normal file
@@ -0,0 +1,44 @@
|
||||

|
||||
|
||||
scrapy引擎
|
||||
|
||||
调度器
|
||||
|
||||
Spiders
|
||||
|
||||
下载器
|
||||
|
||||
Item Pipeline
|
||||
|
||||
itemloader用来装载,item用来容纳,itempipeline用来过滤。也负责了指明了存好数据的item的数据流动的方向。itemloader是活动在原始数据和item之间的桥梁。itempipeline是活动在item和具体存储数据的位置之间的桥梁。比如用来操纵数据库、用来写入文件,用来提供下一次爬虫的相关信息。
|
||||
|
||||
下载器中间件
|
||||
|
||||
由调度器具体指挥,能够根据引擎发送的request对象,封装真正的request请求,并且设置请求的响应参数。不同的下载器中间件,能够完成不同的任务。
|
||||
|
||||
Spider中间件
|
||||
|
||||
引擎和Spider之间的钩子。用来处理Spider发送给引擎的request和Item和引擎发送给Spider的response。有点像网络的分层,没一层都向发送数据中添加一点内容,每一层都从接受数据中获得一点内容。有很多中间件,可以在这里过滤掉一些错误。另外,如果错误能够越提前的发现,则越有利于提高效率。
|
||||
|
||||
扩展Extension和信号signal
|
||||
|
||||
框架提供了一个很好的扩展机制。在配置文件中声明,如果想要在某个地方进行扩展,可以通过这种方式:在要扩展的地方产生一个独特的信号。然后在扩展类中接受这个信号。接下来对接受到的信号和数据进行处理。最后将执行权返回。通过配置文件中的EXTENSION架子啊和激活。
|
||||
|
||||
而且信号能够诶眼催处理,停止处理等。有点像事件驱动机制一样。当产生一个事件,监听器就能监听到,然后做出响应的反应。这种方法,的确有利于扩展。
|
||||
|
||||
Link Extractors
|
||||
|
||||
从response对象中抽取能够最脏你刚是被过量欧文链接的对象。
|
||||
|
||||
Feed exports
|
||||
|
||||
在存储数据数据之前,对数据进行格式化。数据存储的方式:序列化的方式主要通过一下几个类。JSON,JSON
|
||||
LINES,CSV , XML ,
|
||||
PICKLE,MARSHAL。同时也用来定义数据存储的方式可以是本地文件系统,FTP,S3,标准输出等。通过URI类实现具体存储的方式。
|
||||
|
||||
异常Exception
|
||||
|
||||
内置了异常参看手册。主要的异常类有:DropItem
|
||||
有itempipeline跑出,用来停止处理item。CloseSpider由Spider的回调函数抛出,用来停止spider。IgnoreRequest
|
||||
由调度器或者下载中间价抛出,生命忽略该request。NotConfigured
|
||||
由任何组件抛出,声明其仍然保持关闭。NotSupported声明了一个不支持的特性。
|
||||
43
Python/Scrapy/Xpath学习 CSS选择器学习.md
Normal file
43
Python/Scrapy/Xpath学习 CSS选择器学习.md
Normal file
@@ -0,0 +1,43 @@
|
||||
XPath使用路径表达式来选取XML文档中的节点或者节点集合。节点是通过path或者步来选取的。
|
||||
|
||||
1\. 通过已经有的表达式选取节点、元素、属性和内容
|
||||
|
||||
nodename 选取此节点的所有子节点
|
||||
|
||||
/ 从根节点开始选取
|
||||
|
||||
// 从匹配选择的当前节点选择文档中的节点
|
||||
|
||||
. 选取当前节点
|
||||
|
||||
.. 选取当前节点的父节点
|
||||
|
||||
@ 选取属性
|
||||
|
||||
2\. 带有位于的路径表达式,使用[ ]来表示当前节点被选取的一些条件
|
||||
|
||||
/bookstor/book[price\>35]/title
|
||||
|
||||
3\. 通配符来选取未知的元素(一般也用python的re表达式)
|
||||
|
||||
\* 匹配任何元素的节点
|
||||
|
||||
@\* 匹配带有任何属性节点(没有属性的节点不行)
|
||||
|
||||
node() 匹配任何类型的接待你。
|
||||
|
||||
对于CSS来说,选择器与HTML和CSS相关。
|
||||
|
||||
.class intro 查找类别下的元素
|
||||
|
||||
\#id \#firstname id=\*的所有用户
|
||||
|
||||
element p 选择所有的元素
|
||||
|
||||
element,element 并列选择
|
||||
|
||||
element element 父子选择
|
||||
|
||||
element\>element 父元素选择
|
||||
|
||||
element element
|
||||
BIN
Python/Scrapy/media/8c591d54457bb033812a2b0364011e9c.jpeg
Normal file
BIN
Python/Scrapy/media/8c591d54457bb033812a2b0364011e9c.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 90 KiB |
20
Python/Scrapy/scrapy框架学习——Selector选择器.md
Normal file
20
Python/Scrapy/scrapy框架学习——Selector选择器.md
Normal file
@@ -0,0 +1,20 @@
|
||||
爬取网站最常见的任务是从HTML源代码中提取数据。常用的库有BeautifulSoup。lxml库,Xpath。
|
||||
|
||||
Selector 中Xpath和CSS的使用
|
||||
|
||||
标签是节点 ,可以有层级
|
||||
|
||||
属性使用@来调用
|
||||
|
||||
内容要用text()来调用
|
||||
|
||||
条件要在[ ]写明白,也可以是contains[]
|
||||
|
||||
//表示获得所有的某一个标签
|
||||
|
||||
./表示下一级的方法
|
||||
|
||||
可以使用正则表达式最原始的过滤。
|
||||
|
||||
response**.**xpath('//a[contains(@href,
|
||||
"image")]/text()')**.**re(r'Name:\\s\*(.\*)')
|
||||
73
Python/Scrapy/scrapy框架学习——Spiders.md
Normal file
73
Python/Scrapy/scrapy框架学习——Spiders.md
Normal file
@@ -0,0 +1,73 @@
|
||||
Spider类定义了如何爬去某个网站,包括爬去的动作、分析某个网页。
|
||||
|
||||
这个流程再清晰一下 发送请求-\>返回网页-\>分析处理生成数据-\>保存。
|
||||
|
||||
对爬虫过程的描述:
|
||||
|
||||
1. 初始的URL初始化Request,设置回调函数。下载完成,生成response,并作为参数传给该回调函数。start_requests()来获取start_urls.
|
||||
|
||||
2. 在回调函数内分析返回的网页内容,返回Item对象,或者Request或者一个包括而止的可迭代的容器。放回的Response对象经过处理,调用callback函数。
|
||||
|
||||
3. 在回调函数内可以使用选择器(Xpath解析器等任何解析器)来分析内容,并根据分析,生成数据item
|
||||
|
||||
4. 最后,spider返回的item将被存到数据库中或者导入文件当中。
|
||||
|
||||
Spider crawl mysqpider -a category=electronics
|
||||
传递spider的参数,限定爬去网站的部分。
|
||||
|
||||
函数的调用流程
|
||||
|
||||
spider的构成:
|
||||
|
||||
name 名字,作用域内唯一。
|
||||
|
||||
allowed_domains可选,包含了spider爬取的域名domain列表list
|
||||
|
||||
start_urls 从该列表脏欧冠呢开始进行爬去。
|
||||
|
||||
start_requests()必须返回一个可迭代对象。该对象包含了spider用于爬去的第一个Request。make_reuest_from_url()将被调用来创建Request对象。
|
||||
|
||||
make_requests_from_url(url)该方法接受URL返回requests对象。将URL转换为Request对象。parse()作为回调函数。
|
||||
|
||||
parse(response)当response没有指定回调函数时,该方法是scrapy处理下载的response的默认方法。parse负责处理response并返回处理的数据以及跟进的URL。所有的Request回调函数必须范式一个包含Request或Item的可迭代的对象。
|
||||
|
||||
log(mewwage[,level,component])日志记录
|
||||
|
||||
closed(reason)spider关闭时这个函数被调用。
|
||||
|
||||
Spider的样例
|
||||
|
||||
**import** scrapy**from** myproject.items **import** MyItem**class**
|
||||
**MySpider**(scrapy**.**Spider): name **=** 'example.com' allowed_domains **=**
|
||||
['example.com'] start_urls **=** [ 'http://www.example.com/1.html',
|
||||
'http://www.example.com/2.html', 'http://www.example.com/3.html', ] **def**
|
||||
**parse**(self, response): sel **=** scrapy**.**Selector(response) **for** h3
|
||||
**in** response**.**xpath('//h3')**.**extract(): **yield** MyItem(title**=**h3)
|
||||
**for** url **in** response**.**xpath('//a/@href')**.**extract(): **yield**
|
||||
scrapy**.**Request(url, callback**=**self**.**parse)
|
||||
|
||||
CrawlSpider ( scrapy.contrib.spiders.CrawlSpider)
|
||||
|
||||
> rules 包含多个Rule对象的列表。
|
||||
|
||||
> parse_start_url(response)当start_url的请求返回时,该方法被调用。
|
||||
|
||||
XMLFeedSpider
|
||||
|
||||
CSVFeedSpider
|
||||
|
||||
SitemapSpider
|
||||
|
||||
爬取规则(scrapy.contrib.spiders.Rule())
|
||||
|
||||
link_extractor 是一个LinkExtracto对象,定义了如何从爬取到的页面提取链接。
|
||||
|
||||
callback当从link_extractor中获取到链接之后,将会调用该函数。该回调函数接受一个response作为第一个参数,并返回一个包含Item以及Request对象的列表。(不要使用parse)
|
||||
|
||||
cb_kwargs传递给回调函数的参数的字典。
|
||||
|
||||
follow是一个Boolean,从response中提取的链接是否需要跟进。
|
||||
|
||||
process_links该方法用来过滤,也是回调函数。
|
||||
|
||||
process_request该规则提取到的每个request队徽调用这个函数,并且返回一个request或者None。
|
||||
66
Python/Scrapy/scrapy视频学习.md
Normal file
66
Python/Scrapy/scrapy视频学习.md
Normal file
@@ -0,0 +1,66 @@
|
||||
spider 的使用说明:
|
||||
|
||||
继承scrapy.spider
|
||||
|
||||
name spider的名字
|
||||
|
||||
start_urls初始链接
|
||||
|
||||
request 发送请求并且捕获相应,通过回调函数parse处理response相应
|
||||
|
||||
request函数能够发送请求,request函数需要一个回调函数,来接受请求。默认的request函数调用了parse,但是在多次request中,需要设置不同的parse函数,来处理多次请求
|
||||
|
||||
python
|
||||
回调函数的意思就是在一个函数的某个地方通过一个函数指针,调用另外一个函数,使得函数跳转。因为python是脚本,所以,在没有返回值的python函数执行时,如果函数跳转到其他地方,并不会返回一个值到原来的地方。
|
||||
|
||||
轮换useragent的目的:
|
||||
|
||||
当你使用同一个浏览器的时候(同一个useragent)会因为过度浪费服务器资源而被禁掉。
|
||||
|
||||
scrapy的一些内置特性:
|
||||
|
||||
scrapy内置的数据抽取其:css/xpath/re
|
||||
|
||||
scrapy内置结果的输出:csv,xml,json
|
||||
|
||||
自动处理编码
|
||||
|
||||
有丰富的内置扩展
|
||||
|
||||
cookies session 客户端和服务器端的缓存机制
|
||||
|
||||
Http features:compression,authentication,caching
|
||||
|
||||
user-agent spoofing轮换useragent(用户代理的意思浏览器的类型)
|
||||
|
||||
robots.txt 网站中用来告诉爬虫那些资源时可以被访问的,哪些资源时不能被访问的。
|
||||
|
||||
crawl depth restriction 限制爬去的深度
|
||||
|
||||
itme Pipeline的作用:
|
||||
|
||||
清洗HTML数据
|
||||
|
||||
验证抓取到的数据
|
||||
|
||||
检查是否存在重复
|
||||
|
||||
存储抓取到的数据到数据库中。
|
||||
|
||||
关于parse分析response后返回值的问题:
|
||||
|
||||
如果parse的返回值是一个request,将进行更深层侧的爬虫抓去。
|
||||
|
||||
如果parse的返回值是一个item,则程序的执行权就会交个itempipeline,然后pipeline负责处理返回的item对象。包括这些item对象是否合理。
|
||||
|
||||
一个简单爬虫的具体分析步骤:
|
||||
|
||||
创建工程
|
||||
|
||||
编写item用来结构化分析数据使用
|
||||
|
||||
编写spider用来爬去具体的网站
|
||||
|
||||
编写和配置pipeline,主要实现对生成的item的处理
|
||||
|
||||
调试运行代码
|
||||
13
Python/Scrapy/scrapy进阶手记.md
Normal file
13
Python/Scrapy/scrapy进阶手记.md
Normal file
@@ -0,0 +1,13 @@
|
||||
对框架的基本内容有所理解了:
|
||||
|
||||
上图:
|
||||
|
||||
刚刚发现,只有xicidaili.com能够空头访问,而微信和百度都不能空头访问。这说明,代码运行不了的原因是,没有加载头部信息。不不不。xicidaili.com也不饿能进行空头访问,知识他在访问的时候自动加载了头部,而其他网站,都没有加载默认配置,为毛子??????????
|
||||
|
||||
1\. 增加并发,
|
||||
|
||||
通过这一次的运行知道两件事情:
|
||||
|
||||
问题一定出在最简单的地方,往往是你对一些习惯性的东西太不了解导致的。
|
||||
|
||||
阅读日志文档,了解基础知识真的很重要呀呀呀呀!!!!愚蠢的殷康龙
|
||||
1
Python/Scrapy/注意.md
Normal file
1
Python/Scrapy/注意.md
Normal file
@@ -0,0 +1 @@
|
||||
以后逐步将手写笔记改为网络端。(节约时间、便于调整,有利于复习)
|
||||
Reference in New Issue
Block a user