爬虫之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.汽车之家客户端官方免费下载移动产品二手车之家囊括了全国近50万辆真实二手车车源,每天有近80万用户访问,合作商家达到近15000家,每天有数千条的二手车源发布。 手机汽车之家 为汽车爱好者提供随时随地汽车相关服务,无论您身处何地,只要一部可以上网的手机,第一手的新鲜酷车资讯马上呈现到您的面前!https://www.athmapp.com/apps/
2.汽车之家客户端官方免费下载移动产品热点资讯专业全面,海量用户评论交流,选车买车便宜放心。汽车之家App全方位服务您的车生活。 汽车报价 买车问价就用汽车报价。真实有效的车型及价格信息一手掌握,搭载“实时沟通”工具十万销售顾问在线等你。让您更轻松的找车、买车! 二手车之家 二手车之家囊括了全国近50万辆真实二手车车源,每天有近80万用户访问,https://app.autohome.com.cn/
3.汽车之家2024官方下载汽车之家app最新版本免费下载电脑访问sj.qq.com下载应用宝电脑版 简介 汽车之家,每天超过千万用户访问的汽车网站~为消费者提供选车、买车、用车、换车等所有环节准确、快捷的一站式服务 5亿家人与你一起使用汽车之家App。 ***网友为何都用汽车之家App*** 热点资讯专业全面 — 专业编辑团队,众多名家创作优质内容;海量用户评论交流 — 千万https://android.myapp.com/myapp/detail.htm?apkName=com.cubic.autohome&apkCode=610
4.汽车之家历史版本下载汽车之家老版本大全 APK11.68.5 汽车之家 2024-11-18 92.9MB APK11.68.3 汽车之家 2024-11-11 92.7MB APK11.68.0 汽车之家 2024-11-04 92.7MB APK11.67.8 汽车之家 2024-10-29 93.0MB APK11.67.5 汽车之家 2024-10-21 92.9MB APK11.67.3 汽车之家 https://m.liqucn.com/os/android/rj/27212-history.wml
5.汽车之家11.67.5下载安装汽车之家老旧历史版本下载汽车之家,每天超过千万用户访问的汽车网站~为消费者提供选车、买车、用车、换车等所有环节准确、快捷的一站式服务5亿家人与你一起使用汽车之家App。***网友为何都用汽车之家App***热点资讯专业全面 — 专业编辑团队,众多名家创作优质内容;海量用户评论交流 — 千万用户互动,人气火爆的汽车交流平台;前沿技术引领https://www.25pp.com/xiazai/280397/history_v11675/
6.[汽车之家app下载]汽车之家官方版下载汽车之家app专题合集 汽车之家是非常实用的汽车服务软件,专注为用户提供最方便,最便捷的看车服务,在这里用户可以很方便的了解各种品牌的汽车信息,让你从车盲到专家,而且还能通过软件进行视频看车,为用户带来最方便的看车选车。华军软件园为您提供汽车之家合集下载,快来体验吧! 点击查看 https://m.onlinedown.net/zt/80268/
7.应用详情“没事就喜欢在汽车之家逛一逛,可以了解很多汽车行情,和用车知识还可以在论坛里朋友些交流,很好的软件”by 源征“几乎天天都用汽车之家看些汽车新闻,编辑的帖子还是比较中肯的,还有论坛,能看到一些车主的用车情况,这个软件还是不错的”by 用户名已存在“一直以来都很感谢有汽车之家这样的好软件,为喜欢车的朋友http://sharess.cn/page/app/detail?id=bghhg%2FR%2Fih67qGJwugxc5A%3D%3D
8.汽车之家下载汽车之家版本大全汽车之家下载合集为大家提供了全网最新的汽车之家下载地址,在这里,大家可以找到各种各样的汽车之家版本下载,还包括汽车之家安卓版、ios版、官方版等下载,方便大家更好的体验汽车之家。https://www.18183.com/heji/115515/
9.卡车之家卡车之家为您提供最新卡车报价,新旧货车价格及图片大全;精彩卡车新闻,行情,评测,导购内容;司机招聘,养车百科,配件商城,问答社区,是最权威商用车服务平台.http://www.360che.com/
10.www.jxmzxx.com{$woaini}>www.jxmzxx.com{$woaini}时一度需要加价7万,让很多网友觉得,销量要爆了,妥妥的爆款,去过日本的很多网友其实体验过这款汽车。日前,第一财经记者走访看到,该大厦底层有一家manner的咖啡店,但就在同一层,原本不大的空间里,还有http://www.jxmzxx.com/appnews_20241118/63489597.html
11.www.hetong.org.cn/qxnewsxin/km6063021.html据悉,零跑SUV家族C16?C11?C10稳居汽车之家15万-20万元新能源SUV口碑榜前三,这背后当然离不开零跑在技术研发和生产工艺上的持续投入和积累。以零跑C16为例,作为全球首创MPSUV,零跑C16融合MPV宽敞舒适空间,与SUV的造型风格和功能,是LEAP3.0技术架构旗舰之作。C16搭载了行业领先的"四叶草"中央集成电子电气架构,是真正https://www.hetong.org.cn/qxnewsxin/km6063021.html
12.www.scmc踢踏之家最新版下载 12种黄片软件 七月丁香在线 41.64MB 29%好评255人) AAAA特大黄日B片 黄色猛烈抽擦视频 杏彩体育招商的7IIII2扣 39.05MB 30%好评3226人) 插逼逼穴撞猛插视频 人善交Vei欧美 啊灬啊灬啊灬啊灬啊灬高潮 68.04MB 09%好评360人) 意昂体育主管 雀7IIII2扣安稳 大黑http://www.scmc-xa.com/xxxr454168
13.www.sdmzgz.cn/go57124046.htm欧洲vodafonewifi18大豆行情 艹屄视频在线下载 虎白女粉嫩高清在线观看免费 91沈先生一区二区三区四区 男人扒开女人的腿揉操的视频网站 小浪货腿张开水好多啊宝贝乖 丰满少妇呻吟高潮经历 黄色真人亚洲无码 风流老太婆BBB有毛 七个人玩我一个人 国产精品白浆一区二小说 疯狂大杂交4P 女孩之家1.6安卓版怎http://www.sdmzgz.cn/go57124046.htm
14.www.jnsh88.com/mokoi11汽车之家2023年最新汽车报价 欧美重口人和动物 麻豆91抖阴 亚洲综合无码另类中文精品一区破处 我要举看男人的坤坤插进女人下面 母乳人妻羽月希喷乳 无码免费体验视频网站 处女上厕所三级片 情趣福利视频 色婷婷禁欲yy 6680伦理电影 五月天色色强奸小说 未满18岁勿进的软件 少妇性爱宝典125P 把男生的肌肌插入女生的肌http://www.jnsh88.com/mokoi11_22/848823.html
15.www.vita361.com/mokslip99927.html据陈重远先生《古玩史话与鉴赏》所述,辛亥革命后,陈昔凡赋闲,就住在北京琉璃厂“崇古斋”的后院。他为人温和,从不插手“崇古斋”的业务,续弦是北京西城宦家之后谢氏。谢氏也没有生育,但为人贤惠,掌管家中一切,待继子陈独秀如“己出”。陈昔凡卒于1913年,享年六十四岁,死于故里。 https://www.vita361.com/mokslip99927.html
16.IT之家IT之家,青岛软媒旗下的前沿科技门户网站。快速播报科技行业新闻头条快讯和手机数码产品评测,关注智能车电动车、AR/VR虚拟现实、苹果iOS/iPadOS、鸿蒙OS、谷歌Android、微软Win11/Win10/Win7,紧盯iPhone/iPad、安卓智能设备手机等数码潮流。https://www.ithome.com/
17.重生后,弃女毒妃飒爆全京城踢踏之家最新版下载 74.60MB 57%好评41人) 风?家有儿女刘星推到朵朵 美女a黄色视频亚瑟 迈开腿让尝尝你森林视频 16.02MB 35%好评919人) 亚洲水中色一区蜜桃 免费观看在线播放特级黄色一级污片 美女胸18下禁久久久久久 71.11MB 27%好评11人) 博希平台 麻7IIII2扣不错 免费做运动打扑克视频http://rrkjav.com/news.php/53941108.htm
18.长安之家app下载安卓开发者:重庆恒创领沃汽车服务有限公司备案号:渝ICP备2021005743号-3A 恒创领沃汽配商城下载安装失败或使用异常,请 -> 一键举报 查看更多 v4.1.8版更新说明 全新的UI设计,为您带来前所未有的视觉体验,全新的购物功能,拼团,砍价,积分商城,会员积分兑换,幸运抽奖,底价预售等等优惠活动,汽车配件,汽车改装,应有尽有https://m.iuuu9.com/app/com.changanzhijia.mm
19.汽车之家车机高级玩法今天我就要带领大家玩更高级的功能了:调试模式入门之玩转应用安装、运行、及卸载。正题开始。 电脑版的教程后面出,首先今天来做手机版的教程,因为手机最方便。 首先要使用到remote adb shell 这个软件,安装到手机上。可以百度下载,也可以在官网上下载。 http://www.360doc.com/content/24/0220/17/9144_1114632153.shtml
20.汽车之家怎么设置文章小图模式设置文章小图模式方法汽车之家怎么设置文章小图模式?汽车之家是一款可以查看汽车资讯以及预约汽车试驾的软件,很多小伙伴很喜欢使用汽车之家来浏览一些汽车资讯,这样就需要使用小图模式方便自己的浏览,很多小伙伴不知道怎么设置,那么具体的接下来就跟着雨轩小编一起来了解一下《汽车之家》设置文章小图模式。 https://m.yuxedu.cn/gl/81546.html