当前位置: 首页 > java >正文

scrapy爬取图片

一.遇到的问题总结

scrapy中爬取的多有数据(通过spider.py),最后必须通过items实例格式化后,传递到pipelines中进行进一步的处理(注意scrapy内置的pipelines文件,像下载图pain)

Request中meta参数的作用是传递信息给下一个函数,使用过程可以理解成:

把需要传递的信息赋值给这个叫meta的变量,但meta只接受字典类型的赋值,因此要把待传递的信息改成“字典”的形式,即:
meta={'key1':value1,'key2':value2}
如果想在下一个函数中取出value1,只需得到上一个函数的meta['key1']即可,因为meta是随着Request产生时传递的,下一个函数得到的Response对象中就会有meta,
即response.meta,
前一个函数的meta和后一个函数的meta是相同的,取value1则是value1=response.meta['key1']

这些信息可以是任意类型的,比如值、字符串、列表、字典......方法是把要传递的信息赋值给字典的键,分析见如下语句(爬虫文件):

 1 作者:乌尔班
 2 链接:https://www.zhihu.com/question/54773510/answer/146971644
 3 来源:知乎
 4 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 5 
 6 class example(scrapy.Spider):
 7     name='example'
 8     allowed_domains=['example.com']
 9     start_urls=['http://www.example.com']
10     def parse(self,response):
11            #从start_urls中分析出的一个网址赋值给url
12            url=response.xpath('.......').extract()
13            #ExamleClass是在items.py中定义的,下面会写出。
14            """记住item本身是一个字典"""
15            item=ExampleClass()
16            item['name']=response.xpath('.......').extract()
17            item['htmlurl']=response.xpath('.......').extract()
18            """通过meta参数,把item这个字典,赋值给meta中的'key'键(记住meta本身也是一个字典)。
19            Scrapy.Request请求url后生成一个"Request对象",这个meta字典(含有键值'key','key'的值也是一个字典,即item)
20            会被“放”在"Request对象"里一起发送给parse2()函数 """
21            yield Request(url,meta={'key':item},callback='parse2')
22      def parse2(self,response):
23            item=response.meta['key']  #(准确的说是一种浅复制,见文末)实现了两个函数之间参数的共享,相当于 item=item,操作的是同一个items.py中的item字典
24            """这个response已含有上述meta字典,此句将这个字典赋值给item,
25            完成信息传递。这个item已经和parse中的item一样了"""
26            item['text']=response.xpath('.......').extract()
27            #item共三个键值,到这里全部添加完毕了
28            yield item

items.py中语句如下:

1 class ExampleClass(scrapy.Item):
2     name = scrapy.Field()
3     htmlurl = scrapy.Field()
4     text=scrapy.Field()

meta当然是可以传递cookie的(第一种):

下面start_requests中键‘cookiejar’是一个特殊的键,scrapy在meta中见到此键后,会自动将cookie传递到要callback的函数中。既然是键(key),就需要有值(value)与之对应,例子中给了数字1,也可以是其他值,比如任意一个字符串。

1 def start_requests(self):
2     yield Request(url,meta={'cookiejar':1},callback=self.parse)
需要说明的是,meta给‘cookiejar’赋值除了可以表明要把cookie传递下去,还可以对cookie做标记。一个cookie表示一个会话(session),如果需要经多个会话对某网站进行爬取,可以对cookie做标记,1,2,3,4......这样scrapy就维持了多个会话。

 1 def parse(self,response):
 2     key=response.meta['cookiejar']    #经过此操作后,key=1【cookiejar:1---->key:cookiejar----->key=reponse.meta['cookiejar']    =1】
 3     yield Request(url2,meta={'cookiejar':key},callback='parse2')
 4 def parse2(self,response):
 5     pass
 6 

 

上面这段和下面这段是等效的:
1 def parse(self,response):
2     yield Request(url2,meta={'cookiejar':response.meta['cookiejar']},callback='parse2')
3     #这样cookiejar的标记符还是数字1
4 def parse2(self,response):
5     pass

传递cookie的第二种写法:

如果不加标记,可以用下面的写法:

1 #先引入CookieJar()方法
2 from scrapy.http.cookies import CookieJar

写spider方法时:

1 def start_requests(self):
2     yield Request(url,callback=self.parse)#此处写self.parse或‘parse’都可以
3 def parse(self,response):
4     cj = response.meta.setdefault('cookie_jar', CookieJar())
5     cj.extract_cookies(response, response.request)
6     container = cj._cookies
7     yield Request(url2,cookies=container,meta={'key':container},callback='parse2')
8 def parse2(self,response):
9     pass

meta是浅复制,必要时需要深复制。

可以这样引入:

1 import copy
2 meta={'key':copy.deepcopy('value')}

 






作者:乌尔班
链接:https://www.zhihu.com/question/54773510/answer/146971644
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转载于:https://www.cnblogs.com/qingsheng/p/8905869.html

http://www.xdnf.cn/news/10867.html

相关文章:

  • 值得收藏的十个销售类网站(整理),给想做销售的人用
  • 浅谈flash web的结构
  • 怎么彻底删除系统服务
  • 制作一个简单HTML校园网页(HTML+CSS)学校网站制作 校园网站设计与实现
  • 日本免费空间Atpages.jp老牌稳定支持PHP,CGI和2style.net多域名空间
  • 计算机基础——操作系统
  • stm32 --- ADC,DMA,多路,单次/连续转换(标准外设库)
  • 大学生网页设计制作作业实例代码 (全网最全,建议收藏) HTML+CSS+JS (1)
  • txplatform.exe分析及病毒解决
  • 让 Google 搜索到自己的博客
  • snake 模型
  • 电脑知识:DOS命令使用
  • 【网络安全】简单的免杀方法(基本知识)
  • Xilisoft Video Converter Ultimate 6.05多语言版(含简中)绿色版
  • 多种解决:“Word无法启动转换器mswrd632.wpc”方法
  • Ghost 使用详解
  • 圣天诺(LDK)加密锁 云授权,不用使用硬件的加密锁(加密狗)
  • SP业务新人启蒙
  • android 动态向Gallery中添加图片及倒影3D效果
  • Jenkins环境配置篇-更换插件源
  • GFS - The Google File System
  • 各类免费经典网址
  • 【JavaWeb】SpringBoot原理
  • 【深入 LangChain 的 Model I/O】提示设计、模型调用与输出解析全解析
  • 建设指南 | Cloud Apps + AI Apps端到端智能应用开发平台
  • wsl===windows下安装Linux系统
  • 检索增强的大模型工具调用:语义驱动的精准API选择技术
  • 《Pytorch深度学习实践》ch5-Logistic回归
  • 百万级临床试验数据库TrialPanorama发布!AI助力新药研发与临床评价迎来新基石
  • Rhino插件大全下载指南:解锁犀牛潜能,提升设计效率