爬虫之scrapy框架enjoyzier

在Scrapy的数据流是由执行引擎控制,具体流程如下:

要使用Scrapy框架创建项目,需要通过命令来创建。首先进入到你想把这个项目存放的目录。然后使用以下命令创建:

scrapystartproject[项目名称]2.2.2创建爬虫

创建爬虫:进入到项目所在的路径,执行命令“scrapygenspider[爬虫名][爬虫域名]”

注意:爬虫名不能和创建的项目名一致

创建完项目和爬虫后,目录结构如下图:

项目中主要文件的作用:

scrapygensipderqsbk_spider"qiushibaike.com"创建了一个名字叫做qsbk_spider的爬虫,并且能爬取的网页只会限制在qiushibaike.com这个域名下。

在做一个爬虫之前,一定要记得修改setttings.py中的设置。两个地方是强烈建议设置的。

运行scrapy项目。需要在终端,进入项目所在的路径,然后scrapycrawl[爬虫名字]即可运行指定的爬虫。如果不想每次都在命令行中运行,那么可以把这个命令写在一个文件中。以后就在pycharm中执行运行这个文件就可以了。比如现在新创建一个文件叫做start.py,然后在这个文件中填入以下代码:

fromscrapyimportcmdlinecmdline.execute(["scrapy","crawl","qsbk_spider"])#cmdline.execute("scrapycrawlqsbk_spider".split())2.4.6糗事百科scrapy爬虫笔记

2.提出出来的数据是一个'Selector'或者'Selectorlist'对象,如果想要获取其中的字符串,可以通过getall()或者get()方法。

3.getall()方法获取‘Selector’中的所有文本,返回的是一个列表。get()方法获取的是‘Selector’中的第一个文本,返回的是一个str类型。

4.如果数据解析完成后,要传给pipline处理,可以使用'yield'来返回,或者是收取所有的item,组合成一个列表,最后统一使用return返回。

5.item:建议在'items.py'中定义好要传递的数据。

6.pipeline:这个是专门用来保存数据的,其中有三个方法经常会用到。

*"open_spider(self,spider)":当爬虫被打开时执行。

*"process_item(self,item,spider)":当爬虫有item传过来时被调用。

*"close_spider(self,spider)":当爬虫关闭的时候被调用。

要激活pipeline,需要在'settings.py中设置"ITEM_PIPELINES"。示例如下:

ITEM_PIPELINES={'qsbk.pipelines.QsbkPipeline':300,}7.保存json数据的时候,可以使用JsonItemExporter和JsonLinesItemExporter类,优化数据存储方式

*JsonItemExporter:每次把数据添加到内存中,最后统一写入到磁盘。优点:存储的数据是一个满足json规则的数据。缺点:当数据量很大的时候比较耗内存。示例代码如下:

fromscrapy.exportersimportJsonItemExporterclassQsbkPipeline(object):def__init__(self):self.fp=open('duanzi.json','wb')self.exporter=JsonItemExporter(self.fp,ensure_ascii=False,encoding='utf-8')self.exporter.start_exporting()defopen_spider(self,spider):print('爬虫开始了...')defprocess_item(self,item,spider):self.exporter.export_item(item)returnitemdefclose_spider(self,spider):self.exporter.finish_exporting()self.fp.close()print('爬虫结束')ViewCode*JsonLinesItemExporter:这个是每次调用export_item的时候就把这个item存储到硬盘中,缺点:每个字典是一行,整个文件不是一个满足json格式的文件。优点:每次处理数据的时候就直接存储到硬盘中,这样不会耗内存,数据也比较安全。示例代码如下:

fromscrapy.exportersimportJsonLinesItemExporterclassQsbkPipeline(object):def__init__(self):self.fp=open('duanzi.json','wb')self.exporter=JsonLinesItemExporter(self.fp,ensure_ascii=False,encoding='utf-8')defopen_spider(self,spider):print('爬虫开始了...')defprocess_item(self,item,spider):self.exporter.export_item(item)returnitemdefclose_spider(self,spider):self.fp.close()print('爬虫结束')ViewCode3.CrawlSpider在上一个糗事百科的爬虫案例中。我们是自己在解析完整个页面后获取下一页的url,然后重新发送一个请求。有时候我们想要这样做,只要满足某个条件的url,都给我进行爬取。那么这时候我们就可以通过CrawlSpider来帮我们完成了。CrawlSpider继承自Spider,只不过是在之前的基础之上增加了新的功能,可以定义爬取的url的规则,以后scrapy碰到满足条件的url都进行爬取,而不用手动的yieldRequest。

3.1.1创建CrawlSpider爬虫

之前创建爬虫的方式是通过scrapygenspider[爬虫名字][域名]的方式创建的。如果想要创建CrawlSpider爬虫,那么应该通过以下命令创建:

scrapygenspider-tcrawl[爬虫名字][域名]3.1.2LinkExtractors链接提取器

使用LinkExtractors可以不用程序员自己提取想要的url,然后发送请求。这些工作都可以交给LinkExtractors,他会在所有爬的页面中找到满足规则的url,实现自动的爬取。以下对LinkExtractors类做一个简单的介绍:

3.1.3Rule规则类

定义爬虫的规则类。以下对这个类做一个简单的介绍:

classscrapy.spiders.Rule(link_extractor,callback=None,cb_kwargs=None,follow=None,process_links=None,process_request=None)主要参数讲解:

爬虫部分代码:

importscrapyclassWxappItem(scrapy.Item):#definethefieldsforyouritemherelike:#name=scrapy.Field()title=scrapy.Field()author=scrapy.Field()pub_time=scrapy.Field()content=scrapy.Field()items.pypipeline部分代码:

1.CrawlSpider使用"LinkExtractor"和Rule决定爬虫的具体走向。

2.LinkExtractor参数allow设置规则:设置的url正则表达式要能够限制在我们想要的url上

3.Rule参数follow的设置:如果在爬取页面的时候,需要将满足当前条件的url再进行跟进,那么设置为Ture,否则设置为False。

4.什么时候指定callback:如果这个url对应的页面,只是为了获取更多的url,并不需要里面的数据,那么可以不指定callback,如果想要获取url对应页面中的数据,那么就需要指定一个callback。

1.url:这个是request对象发送请求的url

2.callback:在下载器下载完成相应的数据后执行回调函数

3.method:请求的方法,默认为GET方法,可以设置为其他方法

4.headers:请求头,对于一些固定的设置,放在settings.py中指定就可以,对于非固定的请求头,可以在发送请求的时候指定。

6.meta:比较常用,用于在不同的请求之间传递数据

7.encoding:编码,默认为utf-8

8.dot_filter:表示不由调度器过滤,在执行多次重复的请求的时候用的较多,设置为True,可避免重复发送相同的请求

9.errback:在发送错误的时候执行的函数

发送Post请求:

有时候我们想要在请求数据的时候发送post请求,那么这时候需要使用Request的子类FormRequest来实现。如果想要在爬虫一开始的时候就发送Post请求,那么需要在爬虫类中重写start_requests(self)方法,并且不再调用start_urls里的url.

Response对象一般由Scrapy自动构建,因此开发者不需要关心如何创建Response对象。Response对象有很多属性,常用属性如下:

1.meta:从其他请求传过来的meta属性,可以用来保持多个请求之间的数据连接

2.encoding:返回当前字符串编码和解码格式

3.text:将返回的数据作为unicode字符串返回

4.body:将返回的数据作为bytes字符串返回

5.xpath:xpath选择器

6.css:css选择器

importscrapyclassBm5XItem(scrapy.Item):#definethefieldsforyouritemherelike:#name=scrapy.Field()category=scrapy.Field()urls=scrapy.Field()items.pypipeline部分代码:

importosfromurllibimportrequestclassBm5XPipeline(object):def__init__(self):BATH=os.path.dirname(os.path.dirname(__file__))self.path=os.path.join(BATH,'images')ifnotos.path.exists(self.path):os.makedirs(self.path)defprocess_item(self,item,spider):category=item['category']urls=item['urls']category_path=os.path.join(self.path,category)ifnotos.path.exists(category_path):os.makedirs(category_path)forurlinurls:image_name=url.split('_')[-1]request.urlretrieve(url,os.path.join(category_path,image_name))returnitempipelines.py2)使用scrapy内置下载文件方法下载汽车之家宝马5系图片,示例如下:

Scrapy为下载item中包含的文件(比如在爬取到产品时,同时也想保存对应的图片)提供了一个可重用的itempipelines。这些pipelines有些共同的方法和结构(我们称之为mediapipeline)。一般来说你会使用Filespipline或者Imagespipline。

为什么要选择使用scrapy内置的下载文件的方法:

1)避免重新下载最近已经下载过的数据

2)可以方便的指定文件存储的路径

3)可以将下载的图片转换为通用的格式,比如png或jpg

4)可以方便的生成缩略图

5)可以方便的检测图片的宽和高,确保他们满足最小的限制

6)异步下载,效率非常高

下载文件的FilesPipeline:

当使用FilesPipline下载文件的时候,按照以下步骤来完成:

1)定义好一个Item,然后在这个item中定义两个属性,分别为file_urls以及files。file_urls是用来存储需要下载的文件的url链接,需要给一个列表。

3)在配置文件setting.py中配置FILES_STORE,这个配置是用来设置文件下载下来的路径。

4)启动pipline,在ITEM_PIPELINES中设置

ITEM_PIPELINES={#'BM5X.pipelines.Bm5XPipeline':300,'scrapy.pipelines.files.FilesPipeline':1}下载图片的ImagesPipeline:

当使用ImagesPipline下载文件的时候,按照以下步骤来完成:

1)定义好一个Item,然后在这个item中定义两个属性,分别为image_urls以及images。image_urls是用来存储需要下载的图片的url链接,需要给一个列表。

3)在配置文件settings.py中配置IMAGES_STORE,这个配置是用来设置图片下载下来的路径。

ITEM_PIPELINES={#'BM5X.pipelines.Bm5XPipeline':300,'scrapy.pipelines.images.ImagesPipeline':1}爬虫部分代码:

importscrapyclassBm5XItem(scrapy.Item):#definethefieldsforyouritemherelike:#name=scrapy.Field()category=scrapy.Field()image_urls=scrapy.Field()images=scrapy.Field()items.pypipeline部分代码:

importosfromscrapy.pipelines.imagesimportImagesPipelinefromBM5XimportsettingsclassBM5XImagesPipeline(ImagesPipeline):defget_media_requests(self,item,info):#这个方法是在发送下载请求之前调用#其实这个方法本身就是去发送下载请求的request_objs=super(BM5XImagesPipeline,self).get_media_requests(item,info)forrequest_objinrequest_objs:request_obj.item=itemreturnrequest_objsdeffile_path(self,request,response=None,info=None):#这个方法是在图片将要被保存的时候调用,来获取这个图片存储的路径path=super(BM5XImagesPipeline,self).file_path(request,response,info)category=request.item.get('category')images_store=settings.IMAGES_STOREcategory_path=os.path.join(images_store,category)ifnotos.path.exists(category_path):os.makedirs(category_path)image_name=path.replace('full/','')image_path=os.path.join(category_path,image_name)returnimage_pathViewCodesetting部分代码:

process_request(self,request,spider):

这个方法是下载器在发送请求之前执行,一般可以在这个里面设置随机代理ip等。

1)参数:

request:发送请求的request对象。

spider:发送请求的spider对象。

2)返回值:

返回None:如果返回None,Scrapy将继续处理该request,执行其他中间件中的相应方法,直到合适的下载器处理函数被调用

返回Response对象:Scrapy将不会调用任何其他的process_request方法,将直接返回这个response对象。已经激活的中间件process_response()方法则会在每个response返回时被调用

返回Request对象:不再使用之前的request对象去下载数据,而是根据现在返回的request对象返回数据。

如果这个方法中出现了异常,则会调用process_exception方法

process_response(self,request,response,spider):

这个是下载器下载数据到引擎过程中执行的方法

request:request对象

response:被处理的response对象

spider:spider对象

返回Response对象:会将这个新的response对象传给其他中间件,最终传给爬虫

返回Request对象:下载器链被切断,返回的request会重新被下载器调度下载

如果抛出一个异常,那么调用request的errback方法,如果没有指定这个方法,那么会抛出一个异常

THE END
1.蓝色车库下的神秘车辆岚图梦想家PHEV车友圈6天前发布于:岚图梦想家 PHEV车友圈 #梦想家PHEV用车心得岚图梦想家,新款车型电子配件不成熟就不要着急出新款,买车需谨慎,小坡挂倒挡能撞前面门上作者提到的车系: 岚图梦想家 EV4.11分 最低售价: 33.99万询底价 参数图片车友圈问答二手车(14辆)3评论3点赞收藏分享 https://www.dongchedi.com/article/1816860684902410
2.怎么预约车汽车之家 看车买车用车换车 文章评测车家号视频选车图片车型对比行情油价百科车标经销商二手车论坛口碑用车请输入您的问题搜索 首页车问答问答详情怎么预约车 之家车友3995858 2024-02-22 13:52:30· 发布于北京 预约车的方法如下: 操作环境:iphone 1、打开滴滴出行app,在首页点击打车选项。 2、输入目的地位置,https://www.autohome.com.cn/ask/3119011.html
3.汽车之家怎么发布帖子?汽车之家发布帖子教程-汽车之家发布帖子教程 1.注册账号 在汽车之家论坛首页点击“注册”,填写相关个人信息,注意保证信息的真实性和准确性,也可以通过第三方账号(微信、QQ等)登录并进行账号绑定。 2.选择版块 注册成功后,进入汽车之家论坛主页,可以看到不同的版块分类。如汽车品牌、车型、区域等。选择合适的版块进行发帖,建议在发帖前https://m.onlinedown.net/article/10039794.htm
4.汽车之家怎么发帖子自己发帖子方法一览手机软件php小编香蕉为您详细介绍汽车之家如何发帖子的方法。在汽车之家网站上,发帖很简单,只需注册登录账号,选择对应版块,点击“发表主题”按钮,填写标题、内容并上传图片,最后点击“发布”即可成功发帖。同时,也可以在别人的帖子下回复评论。希望这些方法能帮助您更好地在汽车之家网站上进行互动交流。 https://m.php.cn/faq/705343.html
5.汽车之家小程序汽车之家小程序简介 汽车之家为您提供最精彩的汽车新闻、评测、报价、图片、视频,最真实的用户买车、用车感受文章,是全球访问量最大的汽车网站。 想要开发同款小程序与本站客服咨询即可。 汽车之家小程序使用方法 方法1. 使用微信扫描本页面上方二维码进入汽车之家小程序 https://www.webgotoo.com/xiaochengxu/3756.html
6.汽车之家小程序二维码汽车之家+小程序入口汽车之家+小程序简介 微信汽车之家+小程序,为你提供了最新的汽车资讯,用户可通过选车查看相关车型的详细信息,并可在论坛中与网友们一同讨论你相中的车型,并可关注某款汽车,价格若有浮动,会第一时间通知您。 小程序功能介绍: 汽车之家为您提供最精彩的汽车新闻、评测、报价、图片、视频,最真实的用户买车、用车感https://www.qqtn.com/xcx/179065.html
7.汽车之家小程序,为你提供全面看车买车来自毛二汽车之家小程序,为你提供全面看车、买车、用车、换车服务 https://kj1e9g.smartapps.cn/view/club/detail/detail?id=107795457&searchParams=%7B%22failUrl%22%3A%22https%3A%2F%2Fclub.autohome.com.cn%2Fbbs%2Fthread%2F6e8f1235e23aa343%2F107795457-1.html%22%2C%22logParams%22%3A%22pu%3D%24puhttps://weibo.com/1261282704/OCLuAeKgI
8.微信小程序推荐大全之201~300个小程序大全网贷之家+小程序简介:网贷之家是中国首家P2P网贷理财行业门户网站,提供全方位、权威的网贷平台数据,是您身边的网贷资讯和P2P理财方面的专家 请至极乐小程序商店搜索『网贷之家+』,微信扫码即可体验 212、金山词霸 金山词霸小程序简介:金山词霸是一款快速,准确的词典翻译工具。 https://blog.csdn.net/sinat_17775997/article/details/73694489
9.我是一直关注汽车之家这几个人,从汽车之家,李想,陈震(二环十三郎我是一直关注汽车之家这几个人,从汽车之家,李想,陈震(二环十三郎),韩路,胡永平,到他们去上市敲钟,到每个人陆续出来创业~韩路要做无人机,说了小时候的梦想,后来开发遇到困难,开5x商城,同时李想,秦致也相继辞职了,韩路彻底关掉无人机项目(我一直认为是卖给大疆了,大疆紧接着发布的Spark,符合韩路一直主张的无人机https://www.lixiang.com/community/detail/article/35545.html
10.北斗星论坛汽车之家论坛升降器(2024已更新微信/小程序)【备婚经验分享】分享适用的婚礼风俗、婚礼风尚、婚礼布置、婚品选购的相关攻略,教你如北斗星论坛汽车之家论坛升降器何成功避坑。 【模拟现场体验】通过VR,3D等技术融合游戏让用户在线上直击婚礼现场,在玩的同时实现备婚全流程。 【婚礼顾问服务】一对一专业婚礼顾问,时刻关注备婚流程节点、提出适时的提示和建议,保证https://www.gfan.com/gftcpjkvst/00U799.html
11.从汽车之家遭封杀,看2019百头腾如何抢道AI媒体汽车之家成立于PC时代的鼎盛时期。在遥远的2005年,只有24岁的李想带着4个人的团队每天工作14个小时,其他网站试驾一周后才发布文章,只有汽车之家做到当天发,文章、图片全部原创。两年后,汽车之家成了同类网站中的流量王,风头不弱于今天的抖音、快手。 https://www.36kr.com/p/5173771
12.hj.chaobiaomao.com/mmmj8065630/914038.html据介绍,为推动大学生就业,贵阳市结合贵阳人才需求、企业发展等实际,推出市领导和38家市直部门负责的“包保制”,共包保74所在黔高校,建立了“招聘会+就业辅导+岗位拓展”稳就业机制,全面摸清了在黔高校学科建设、专业特质、就业情况及毕业生人数等“基数”,持续开展面向毕业生的“小而精、专而优”的就业辅导和招聘活http://hj.chaobiaomao.com/mmmj8065630/914038.html
13.ak.akvtc.cn/mokoi11ak.akvtc.cn/mokoi11_28/ 2022年7月1日,宜春鑫通汽车运输有限公司负责人尹某与刘某先后两次签订货运车辆买卖协议,最终刘某因经营不善导致前后两次分期购车款均无法偿还,双方最终对簿公堂。 经黄颇社区人民调解委员会多次联系,双方来到该委员会调解室现场调解。调解员首先了解了事情的具体情况,而后以二人多年的友情http://ak.akvtc.cn/mokoi11_28/
14.10W粉丝卖100万元,汽车类公众号怎么运营?可以说关注了「汽车之家」的公众号,等于看到了「汽车之家」官网的热门文章,和大家关注的热门车型,还有各种跳转小程序都很方便使用。 2. 玩车教授(自媒体做成平台) 从自媒体一路做成平台的「玩车教授」应该是众多汽车自媒体羡慕的对象。 2014 年 5 月份成立,成立不到半年就拿到了三轮总计 1500 万的投资,观致 3 https://www.marketup.cn/marketupblog/wexin/10284.html
15.一拳打爆,我的buff有亿点多小骚货被干到高潮视频 少妇熟女亚州 经典奥雷《雷》大胆露 欧美老女人j视频 台湾综合色图网 日韩BBBBBBBBB精品 麻豆美女色诱被大屌操 日本操人妻中字 7000精品国产稀缺小u女在线 女生光屁股视频小程序下载 国产Z000XX女人另类 挤奶+玩弄+跪趴+调教的网站 鼎点登录地址 定1.5.9.5.9.5.0安稳定不错 家庭http://www.quinovare.com/xxxr84821217%3C!DOCTYPE/666937.htm
16.www.zkjzxjj.com/xxxr20544592不过,4月14日,在联合国政府间气候变化专门委员会(IPCC)第六次评估报告宣讲会上,IPCC专家翟盘茂表示,目前关于临界点和不可逆现象的研究还远远不够,想要得到结论,需要不同研究者、用不同方法,从观测、机理、模式等多方面提供多重证据。_——。 广东省清远市委原书记郭锋(正厅级)涉嫌受贿一案,由广东省监察委员会调http://www.zkjzxjj.com/xxxr20544592
17.www.sae小逼样人给操逼视频 足足vk free偷拍中国XXXX毛茸茸 22.90MB 1052好评 公息乱乱之一家三口 W78W78W乳液永久十大排名 国产未成女娃仙踪林 92.16MB 73好评 欧美激情午夜影院 开车视频晚上污痛痛 视频 137VT最大但人文艺术A豆瓣 038.81MB 71好评 高清无码超级裸阴 YELLOW片大全动漫 久久男人https://www.sae-shandong.org.cn/gonode51106473.shtml