学爬虫的动力是啥?那肯定就是爬美女图片了。6千多图片看到爽。
scrapy框架介紹
scrapy是由Python語言開發(fā)的一個(gè)快速、高層次的屏幕抓取和web抓取框架,用于抓取web站點(diǎn)并從頁面中提取結(jié)構(gòu)化的數(shù)據(jù)。
scrapy框架的傳送門:
https://scrapy.orgscrapy框架運(yùn)行原理
Scrapy Engine(引擎):負(fù)者Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號(hào)、數(shù)據(jù)轉(zhuǎn)遞等。
Scheduler(調(diào)度器)?:它負(fù)責(zé)接受引擊發(fā)送過來的Request請(qǐng)求,并按照一定的方式進(jìn)行整理排列,入隊(duì),當(dāng)引擎需要時(shí),交還給引擎。
Downloader (下載器):負(fù)責(zé)下載Scrapy Engine(引擎)發(fā)送的所有Requests請(qǐng)求,并將其獲取到的Responses交還給Scrapy Engine(引擎) ,由引擎交給Spider來處理。
Spider (爬蟲)?:它負(fù)責(zé)處理所有Responses,從中分析提取數(shù)據(jù),獲取Item字段需要的數(shù)據(jù),并將需要跟進(jìn)的URL提交給引擎,再次進(jìn)入Scheduler(調(diào)度器)。
Item Pipeline(管道)?:它負(fù)責(zé)處理Spider 中獲取到的Item ,并進(jìn)行進(jìn)行后期處理(詳細(xì)分析、過濾、存儲(chǔ)等)的地方。
Downloader Middlewares (下載中間件)?: 你可以當(dāng)作是一個(gè)可以自定義擴(kuò) 展下載功能的組件。
Spider Middlewares?(Spider中間件)?: 你可以理解為是一個(gè)可以自定擴(kuò)展和操作引擎和Spider中間通信的功能組件(比如進(jìn)入Spider的Responses;和從Spider出去的Requests )
制作 Scrapy 爬蟲 一共需要4步:
新建項(xiàng)目?(scrapy startproject xxx):新建一個(gè)新的爬蟲項(xiàng)目
明確目標(biāo)?(編寫items.py):明確你想要抓取的目標(biāo)
制作爬蟲?(spiders/xxspider.py):制作爬蟲開始爬取網(wǎng)頁
存儲(chǔ)內(nèi)容?(pipelines.py):設(shè)計(jì)管道存儲(chǔ)爬取內(nèi)容
今天我們就以B站小姐姐為例,帶大家親自體驗(yàn)一下scrapy的強(qiáng)大之處!
創(chuàng)建spider項(xiàng)目
首先我們來看看scrapy的常用命令:
scrapy?startproject?項(xiàng)目名稱????#?創(chuàng)建一個(gè)爬蟲項(xiàng)目或工程 scrapy?genspider?爬蟲名?域名?????#?在項(xiàng)目下創(chuàng)建一個(gè)爬蟲spider類 scrapy?runspider?爬蟲文件???????#運(yùn)行一個(gè)爬蟲spider類 scrapy?list??????????????????#?查看當(dāng)前項(xiàng)目有多少個(gè)爬蟲 scrapy?crawl?爬蟲名稱???????????#?通過名稱指定運(yùn)行爬取信息 scrapy?shell?url/文件名????????#?使用shell進(jìn)入scrapy交互環(huán)境第一步我們創(chuàng)建一個(gè)scrapy工程, 進(jìn)入到你指定的目錄下,使用命令:
scrapy?startproject?項(xiàng)目名稱????#?創(chuàng)建一個(gè)爬蟲項(xiàng)目或工程此時(shí)可以看到該目錄下多了一個(gè)叫bbbbl的文件夾
當(dāng)我們創(chuàng)建完項(xiàng)目之后,它會(huì)有提示,那么我們就按照它的提示繼續(xù)操作。
當(dāng)你按照上面的操作,之后你就會(huì)發(fā)現(xiàn),在spiders文件夾下就會(huì)出現(xiàn)spider_bbbl.py這個(gè)文件。這個(gè)就是我們的爬蟲文件。
后面的?earch.bilibili.com就是我們要爬取的目標(biāo)網(wǎng)站
BliBli |——?BliBli |???|——?__init__.py |???|——?__pycache__. |???|——?items.py????????#?Item定義,定義抓取的數(shù)據(jù)結(jié)構(gòu) |???|——?middlewares.py??#?定義Spider和Dowmloader和Middlewares中間件實(shí)現(xiàn) |???|——?pipelines.py????#?它定義Item?Pipeline的實(shí)現(xiàn),即定義數(shù)據(jù)管道 |???|——?settings.py?????#?它定義項(xiàng)目的全局配置 |???|__?spiders?????????#?其中包含一個(gè)個(gè)Spider的實(shí)現(xiàn),每個(gè)Spider都有一個(gè)文件|——?__init__.py|——?spider_bl.py?#?爬蟲實(shí)現(xiàn)|——?__pycache__ |——?scrapy.cfg??# scrapy部署時(shí)的配置文件,定義了配置文件的路徑、部署相關(guān)的信息內(nèi)容。目標(biāo)確定
接下來我們打開B站搜索 '小姐姐'如下。我們今天的任務(wù)很簡單,
視頻標(biāo)題、視頻鏈接、視頻播放時(shí)長、視頻播放量、視頻發(fā)布時(shí)間、視頻作者還有封面圖片和視頻鏈接
網(wǎng)頁分析
我們打開網(wǎng)頁分析這是一個(gè)get請(qǐng)求
分頁是由參數(shù)page來控制的。所有的數(shù)據(jù)都存在于一個(gè)json格式的數(shù)據(jù)集里面
我們的目標(biāo)就是獲取result列表中的數(shù)據(jù)
請(qǐng)求發(fā)送
設(shè)置item模板,定義我們要獲取的信息
????#?視頻標(biāo)題title_video?=?scrapy.Field()#?視頻時(shí)長time_video?=?scrapy.Field()#?播放量num_video?=?scrapy.Field()#?發(fā)布時(shí)間date_rls?=?scrapy.Field()#?作者author?=?scrapy.Field()#?圖片鏈接link_pic?=?scrapy.Field()#?視頻地址link_video?=?scrapy.Field()然后我們?cè)谖覀儎?chuàng)建的spider_bl.py文件中寫我們爬蟲函數(shù)的具體實(shí)現(xiàn)
bl_list?=?response.json()['data']['result'] ic(bl_list)結(jié)果如下:
接下來我們提取我們所需的數(shù)據(jù):
?for?bl?in?bl_list:#?視頻標(biāo)題item['title_video']?=?bl['title']#?視頻時(shí)長item['time_video']?=?bl['duration']#?視頻播放量item['num_video']?=bl['video_review']#?發(fā)布時(shí)間date_rls?=?bl['pubdate']item['date_rls']?=?time.strftime('%Y-%m-%d?%H:%M',?time.localtime(date_rls))#?視頻作者item['author']?=?bl['author']#?圖片鏈接link_pic?=?bl['pic']item['link_pic']?=?'https:'+link_pic#?視頻鏈接item['link_video']?=?bl['arcurl']'''{'author':?'共青團(tuán)中央','date_rls':?'2019-11-26?18:35','link_pic':?'https://i0.hdslb.com/bfs/archive/c24d34f04ba017e806c3554a9fc8c286f809a4b1.jpg','link_video':?'http://www.bilibili.com/video/av77087288','num_video':?1781,'time_video':?'2:7','title_video':?'《華服抄》隨風(fēng)輕逸,蓮步生情(絕美華服小姐姐MV付)'}Excel數(shù)據(jù)成功保存!{'author':?'祖瑜兄','date_rls':?'2019-06-22?18:06','link_pic':?'https://i0.hdslb.com/bfs/archive/784607de4c3397af15838123a2fde8c1d301fb42.jpg','link_video':?'http://www.bilibili.com/video/av56450490','num_video':?5307,'time_video':?'9:51','title_video':?'5分鐘戲腔教程!滿滿干貨不廢話!京劇系小姐姐教你如何快速入門~趕緊收藏~(內(nèi)有清唱示范)'}Excel數(shù)據(jù)成功保存!{'author':?'皮皮皮皮皮皮皮卡乒','date_rls':?'2020-09-02?16:36','link_pic':?'https://i1.hdslb.com/bfs/archive/39600c112ea656788740838d53df36fc3fe29e1f.jpg','link_video':?'http://www.bilibili.com/video/av754474482','num_video':?1148,'time_video':?'3:41','title_video':?'小姐姐:我等會(huì)你(溫柔聲)外賣小哥:我太感動(dòng)了!'}Excel數(shù)據(jù)成功保存!{'author':?'小疼聊音樂','date_rls':?'2020-06-19?17:47','link_pic':?'https://i1.hdslb.com/bfs/archive/d5bc2336899759fc5bc3cd3742f76d2846609fbd.jpg','link_video':?'http://www.bilibili.com/video/av668575442','num_video':?814,'time_video':?'3:29','title_video':?'小姐姐隨口哼兩句,沒想到引發(fā)整棟樓的合唱!這屆畢業(yè)生太慘了!'}Excel數(shù)據(jù)成功保存!{'author':?'奇視界','date_rls':?'2019-11-26?10:39','link_pic':?'https://i0.hdslb.com/bfs/archive/d0c1937e9dbccf2c639be865763e41df78f0bed5.jpg','link_video':?'http://www.bilibili.com/video/av77065062','num_video':?1583,'time_video':?'4:58','title_video':?'兩個(gè)鋼鐵直男交流追女孩子方法,讓坐在邊上的小姐姐笑噴了'}'''我們現(xiàn)在pipeline中打印一下,沒問題我們?cè)賹⑵浔4娴奖镜?
當(dāng)我們要把數(shù)據(jù)保存成文件的時(shí)候,不需要任何額外的代碼,只要執(zhí)行如下代碼即可:
scrapy?crawl?spider爬蟲名?-o?xxx.json??????#保存為JSON文件scrapy?crawl?spider爬蟲名?-o?xxx.jl或jsonlines????#每個(gè)Item輸出一行jsonscrapy?crawl?spider爬蟲名?-o?xxx.csv??????????#保存為csv文件scrapy?crawl?spider爬蟲名?-o?xxx.xml?#保存為xml文件想要保存為什么格式的文件,只要修改后綴就可以了,在這里我就不一一例舉了。
我們?cè)诖藢⑵浔4鏋閖son格式
class?BbbblPipeline:def?process_item(self,?item,?spider):#?保存文件到本地with?open('./B站小姐姐.json',?'a+',?encoding='utf-8')?as?f:lines?=?json.dumps(dict(item),?ensure_ascii=False)?+?'\n'f.write(lines)return?itemsettings.py找到以下字段,取消字段的注釋
#?Obey?robots.txt?rules ROBOTSTXT_OBEY?=?False#?Override?the?default?request?headers: DEFAULT_REQUEST_HEADERS?=?{"User-Agent"?:?str(UserAgent().random),'Accept':?'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' }#?Configure?item?pipelines #?See?https://docs.scrapy.org/en/latest/topics/item-pipeline.html ITEM_PIPELINES?=?{'BliBli.pipelines.BbbblPipeline':?300, }使用如下命令運(yùn)行程序:可以看到產(chǎn)生了一個(gè)json文件
scrapy?crawl?spider_bbbbl打開文件可以看到已經(jīng)成功的獲取到了我們想要的數(shù)據(jù)
保存數(shù)據(jù)Excel
我們使用openpyxl將數(shù)據(jù)保存到excel中便于后面的數(shù)據(jù)分析,我們先在pipeline.py中定義一個(gè)ExcelPipeline的函數(shù),
??#?名稱ws.append(['視頻標(biāo)題',?'視頻時(shí)長',?'視頻播放量',?'發(fā)布時(shí)間',?'視頻作者',?'圖片鏈接',?'視頻鏈接'])#?存儲(chǔ)line?=?[item['title_video'],?item['time_video'],?item['num_video'],?item['date_rls'],?item['author'],?item['link_pic'],item['link_video']]ws.append(line)wb.save('../B站小姐姐.xlsx')然后在settings中打開這個(gè)通道的開關(guān),資源就會(huì)下載下來。
ITEM_PIPELINES?=?{'bbbbl.pipelines.BbbblPipeline':?300,'bbbbl.pipelines.ExcelPipeline':?301, }結(jié)果如下,我們會(huì)在scrapy目錄下發(fā)現(xiàn)一個(gè)我們下載數(shù)據(jù)的excel
可以看到數(shù)據(jù)全部已經(jīng)成功下載到excel中
保存數(shù)據(jù)Mysql
之前我有分享過最新Mysql8.0的下載安裝以及常見問題的處理,尚未安裝的小伙伴可以參考一下
Python操作mysql(上)!一文帶你看懂!
Python操作mysql(下)!一文帶你看懂!
?
跟保存excel的方式大同小異,區(qū)別在于Mysql除了要在setting中配置Pipeline外,還要配置Mysql端口、用戶和密碼等參數(shù)
#?配置Mysql MYSQL_HOST?=?'localhost' MYSQL_DATABASE?=?'BLBL' MYSQL_USER?=?'root' MYSQL_PASSWORD?=?'211314' MYSQL_PORT?=?3306此外我們還需再Pipeline.py中定義一個(gè)MysqlPipeline的類
然后在其中寫Sql并且執(zhí)行。
??#?Sql建表命令sql?=?'''CREATE?TABLE?bbbbl3(id?int?primary?key?auto_increment,?title_video??VARCHAR(200)?NOT?NULL,?time_video??VARCHAR(100),?num_video??INTEGER,?date_rls??VARCHAR(100),?author??VARCHAR(100),?link_pic??VARCHAR(1000),?link_video?VARCHAR(1000));'''#?執(zhí)行建表Sqlcursor.execute(sql)#?插入數(shù)據(jù)value?=?(item["title_video"],?item["time_video"],?item["num_video"],?item["date_rls"],?item["author"],?item["link_pic"],?item["link_video"])#?執(zhí)行操作sql?=?"insert?into?bbbbl3(title_video,time_video,num_video,date_rls,author,link_pic,link_video)?value?(%s,%s,%s,%s,%s,%s,%s)"#?提交數(shù)據(jù)self.db.commit()#?關(guān)閉數(shù)據(jù)庫self.db.close()我使用的Mysql可視化工具是Sqlyog,
執(zhí)行完查詢語句顯示如下:
圖片保存
封面小姐姐的鏈接已經(jīng)獲取到了,接下來我們要做的就是將這些小姐姐下載到我的馬克思主義文件夾下
#?保存圖片到本地with?open('images/{}.jpg'.format(item['title_video']),?'wb')?as?f:req?=?requests.get(item['link_pic'])f.write(req.content)time.sleep(random.random()?*?4)為了防止被網(wǎng)址反爬,加了延時(shí)處理
結(jié)果如下:
總結(jié)
以上是生活随笔為你收集整理的学爬虫的动力是啥?那肯定就是爬美女图片了。6千多图片看到爽。的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: led屏背后线路安装图解_科普:网格屏是
- 下一篇: 2016机器学习大盘点(第3篇)