爬虫之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.图汽车之家选买您好!请 登录 或注册 找论坛 更多应用 文章 评测 车家号 视频 行业 车型对比 图片 报价 车商城 降价 经销商 二手车 金融 论坛 精选 口碑 新能源 微型车 小型车 紧凑型车 中型车 中大型车 大型车 SUV MPV 跑车 皮卡 微面汽车之家选买 主播 汽车之家官方提供的查询最新本地新车成交价服务,供用户https://www.autohome.com.cn/ExpertBlog/zhubo_241013891.html
2.卡车之家卡车之家为您提供最新卡车报价,新旧货车价格及图片大全;精彩卡车新闻,行情,评测,导购内容;司机招聘,养车百科,配件商城,问答社区,是最权威商用车服务平台.http://360che.com/
3.你留在汽车之家的电话号码,5年被“卖”了96亿他认为,汽车之家的声明写明了个人信息的用途,因此将个人信息提供给汽车经销商、厂商及集团并不涉及违法,但如果将个人信息提供给除了车商之外的第三方,例如房产中介等,就涉嫌泄露公民隐私。 汽车之家自己也意识到其平台“个人数据”这一敏感问题。其在财报的风险因素中披露:通过互联网和移动平台运营的公司收集、使用、https://www.iyiou.com/p/94819.html
4.汽车之家2024款报价及图片汽车之家二手车之家app合集游侠手游提供汽车之家官网最新app下载。汽车之家是一款可以全面了解汽车行业资讯和最新市场汽车款式的新闻内容,用户们可以通过软件收集到众多的一手汽车资讯和二手车的相关信息,下面小编整理了一些汽车之家官网合集下载,感兴趣的用户一起来下载关注下吧。https://m.ali213.net/tag/qczj.html
5.汽车之家app下载最新版汽车之家2024最新版AR看车-足不出户,身临其境看车 ”七步买车”一步到位,省时省脑还省钱 优惠买车,超值体验,买车不纠结 查违章,找保养,油卡充值一键触达 厂商联系方式 北京:010-59857000 上海:021-32791688 广州:020-81166300 官方微博:@汽车之家 https://weibo.com/qichezhijia https://www.liqucn.com/bz/27212.shtml
6.汽车报价大全官网汽车之家找车懂车帝提供汽车报价大全官网汽车之家找车的详细内容,懂车帝是一个汽车资讯平台,懂车更懂你。我们提供最新汽车报价,汽车图片,汽车价格大全,行情、评测、导购等内容,看车选车买车就上懂车帝。https://www.dongchedi.com/tag/pgc/12043127
7.汽车报价客户端官方免费下载移动产品买车问价就用汽车报价。真实有效的车型及价格信息一手掌握,搭载“实时沟通”工具十万销售顾问在线等你。让您更轻松的找车、买车!https://www.athmapp.com/apps/price/
8.购车网汽车报价汽车之家购车网是网友的汽车之家,提供汽车报价,汽车导购,汽车团购,二手车,试驾评测,汽车维护等,是专业的网上车市,汽车网和汽车之家.http://ecar168.cn/
9.中国十大汽车网汽车网站有哪些2024年汽车网十大品牌最新发布,汽车网排行榜前十名品牌有汽车之家、易车、懂车帝、太平洋汽车网、爱卡汽车、瓜子、有驾、卡车之家、网上车市、第一电动网。汽车网10大品牌排行榜由品牌研究部门收集整理大数据分析研究得出,帮助你了解汽车资讯网站有哪些。https://www.maigoo.com/maigoo/1349qcwz_index.html
10.李想:汽车之家和理想制造汽车创始人(三)排除在了阻碍的李想和秦致等人,带着汽车之家一路狂奔,之后秦致是如何把汽车之家改造成一家市值百亿的公司?李想又为何选在2015年离开汽车之家?汽车之家上市过程中又经历了哪些曲折?平安收购汽车之家背后又有哪些故事?咱们下期接着聊。 来自:百车全说>《待分类》https://www.360doc.cn/article/72271024_944234856.html