This commit is contained in:
yinkanglong_lab
2021-03-09 20:51:22 +08:00
parent 99855cd76c
commit a5132d34cc
126 changed files with 9999 additions and 0 deletions

View 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的最终值。

View File

@@ -0,0 +1,6 @@
\>
准确的说scrapy主要就有两部分可以编辑一个使用来处理数据的scrapy.Items,另一个用来仓库
Item的操作包括创建、获取字段的值、设置字段的值、后去所欲的键、获取product列表、获取product字段、社赋值和浅复制、集成扩展item。
Item对象的操作 fields内置字段是item生命中使用到的field对象的名字是一个字典。

View 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测试。

View File

@@ -0,0 +1,44 @@
![scrapy_architecture.jpg](media/8c591d54457bb033812a2b0364011e9c.jpeg)
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。同时也用来定义数据存储的方式可以是本地文件系统FTPS3标准输出等。通过URI类实现具体存储的方式。
异常Exception
内置了异常参看手册。主要的异常类有DropItem
有itempipeline跑出用来停止处理item。CloseSpider由Spider的回调函数抛出用来停止spider。IgnoreRequest
由调度器或者下载中间价抛出生命忽略该request。NotConfigured
由任何组件抛出声明其仍然保持关闭。NotSupported声明了一个不支持的特性。

View 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 选择所有的元素
elementelement 并列选择
element element 父子选择
element\>element 父元素选择
element element

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

View 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\*(.\*)')

View 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。

View 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 featurescompressionauthenticationcaching
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的处理
调试运行代码

View File

@@ -0,0 +1,13 @@
对框架的基本内容有所理解了:
上图:
刚刚发现只有xicidaili.com能够空头访问而微信和百度都不能空头访问。这说明代码运行不了的原因是没有加载头部信息。不不不。xicidaili.com也不饿能进行空头访问知识他在访问的时候自动加载了头部而其他网站都没有加载默认配置为毛子
1\. 增加并发,
通过这一次的运行知道两件事情:
问题一定出在最简单的地方,往往是你对一些习惯性的东西太不了解导致的。
阅读日志文档,了解基础知识真的很重要呀呀呀呀!!!!愚蠢的殷康龙

1
Python/Scrapy/注意.md Normal file
View File

@@ -0,0 +1 @@
以后逐步将手写笔记改为网络端。(节约时间、便于调整,有利于复习)