教你分分鐘學會用python爬蟲框架Scrapy爬取心目中的女神
Scrapy主要包括了以下元件:
- 引擎(Scrapy)
用來處理整個系統的資料流處理, 觸發事務(框架核心) - 排程器(Scheduler)
用來接受引擎發過來的請求, 壓入佇列中, 並在引擎再次請求的時候返回. 可以想像成一個URL(抓取網頁的網址或者說是連結)的優先佇列, 由它來決定下一個要抓取的網址是什麼, 同時去除重複的網址 - 下載器(Downloader)
用於下載網頁內容, 並將網頁內容返回給蜘蛛(Scrapy下載器是建立在twisted這個高效的非同步模型上的) - 爬蟲(Spiders)
爬蟲是主要幹活的, 用於從特定的網頁中提取自己需要的資訊, 即所謂的實體(Item)。使用者也可以從中提取出連結,讓Scrapy繼續抓取下一個頁面 - 專案管道(Pipeline)
負責處理爬蟲從網頁中抽取的實體,主要的功能是持久化實體、驗證實體的有效性、清除不需要的資訊。當頁面被爬蟲解析後,將被髮送到專案管道,並經過幾個特定的次序處理資料。 - 下載器中介軟體(Downloader Middlewares)
位於Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應。 - 爬蟲中介軟體(Spider Middlewares)
介於Scrapy引擎和爬蟲之間的框架,主要工作是處理蜘蛛的響應輸入和請求輸出。 - 排程中介軟體(Scheduler Middewares)
介於Scrapy引擎和排程之間的中介軟體,從Scrapy引擎傳送到排程的請求和響應。
Scrapy執行流程大概如下:
- 引擎從排程器中取出一個連結(URL)用於接下來的抓取
- 引擎把URL封裝成一個請求(Request)傳給下載器
- 下載器把資源下載下來,並封裝成應答包(Response)
- 爬蟲解析Response
- 解析出實體(Item),則交給實體管道進行進一步的處理
- 解析出的是連結(URL),則把URL交給排程器等待抓取
一、安裝
因為python3並不能完全支援Scrapy,因此為了完美執行Scrapy,我們使用python2.7來編寫和執行Scrapy。
1 | pip install Scrapy |
注:windows平臺需要依賴pywin32,請根據自己系統32/64位選擇下載安裝,https://sourceforge.net/projects/pywin32/
其它可能依賴的安裝包:lxml-3.6.4-cp27-cp27m-win_amd64.whl,VCForPython27.msi百度下載即可
二、基本使用
1、建立專案
執行命令:
1 | scrapy startproject p1(your_project_name) |
2.自動建立目錄的結果:
檔案說明:
- scrapy.cfg 專案的配置資訊,主要為Scrapy命令列工具提供一個基礎的配置資訊。(真正爬蟲相關的配置資訊在settings.py檔案中)
- items.py 設定資料儲存模板,用於結構化資料,如:Django的Model
- pipelines 資料處理行為,如:一般結構化的資料持久化
- settings.py 配置檔案,如:遞迴的層數、併發數,延遲下載等
- spiders 爬蟲目錄,如:建立檔案,編寫爬蟲規則
注意:一般建立爬蟲檔案時,以網站域名命名
3、編寫爬蟲
在spiders目錄中新建 xiaohuar_spider.py 檔案
示例程式碼:
12345678910111213141516171819 | #!/usr/bin/env python# -*- coding:utf-8 -*-import scrapyclassXiaoHuarSpider(scrapy.spiders.Spider):name="xiaohuar"allowed_domains=["xiaohuar.com"]start_urls=["http://www.xiaohuar.com/hua/",]def parse(self,response):# print(response, type(response))# from scrapy.http.response.html import HtmlResponse# print(response.body_as_unicode())current_url=response.url#爬取時請求的urlbody=response.body#返回的htmlunicode_body=response.body_as_unicode()#返回的html unicode編碼 |
備註:
- 1.爬蟲檔案需要定義一個類,並繼承scrapy.spiders.Spider
- 2.必須定義name,即爬蟲名,如果沒有name,會報錯。因為原始碼中是這樣定義的:
- 3.編寫函式parse,這裡需要注意的是,該函式名不能改變,因為Scrapy原始碼中預設callback函式的函式名就是parse;
- 4.定義需要爬取的url,放在列表中,因為可以爬取多個url,Scrapy原始碼是一個For迴圈,從上到下爬取這些url,使用生成器迭代將url傳送給下載器下載url的html。原始碼截圖:
4、執行
進入p1目錄,執行命令
1 | scrapy crawl xiaohau--nolog |
格式:scrapy crawl+爬蟲名 –nolog即不顯示日誌
5.scrapy查詢語法:
當我們爬取大量的網頁,如果自己寫正則匹配,會很麻煩,也很浪費時間,令人欣慰的是,scrapy內部支援更簡單的查詢語法,幫助我們去html中查詢我們需要的標籤和標籤內容以及標籤屬性。下面逐一進行介紹:
- 查詢子子孫孫中的某個標籤(以div標籤為例)://div
- 查詢兒子中的某個標籤(以div標籤為例):/div
- 查詢標籤中帶有某個class屬性的標籤://div[@class=’c1′]即子子孫孫中標籤是div且class=‘c1’的標籤
- 查詢標籤中帶有某個class=‘c1’並且自定義屬性name=‘alex’的標籤://div[@class=’c1′][@name=’alex’]
- 查詢某個標籤的文字內容://div/span/text() 即查詢子子孫孫中div下面的span標籤中的文字內容
- 查詢某個屬性的值(例如查詢a標籤的href屬性)://a/@href
示例程式碼:
12345678910111213141516171819 | def parse(self,response):# 分析頁面# 找到頁面中符合規則的內容(校花圖片),儲存# 找到所有的a標籤,再訪問其他a標籤,一層一層的搞下去hxs=HtmlXPathSelector(response)#建立查詢物件# 如果url是 http://www.xiaohuar.com/list-1-\d+.htmlifre.match('http://www.xiaohuar.com/list-1-\d+.html',response.url):#如果url能夠匹配到需要爬取的url,即本站urlitems=hxs.select('//div[@class="item_list infinite_scroll"]/div')#select中填寫查詢目標,按scrapy查詢語法書寫foriinrange(len(items)):src=hxs.select('//div[@class="item_list infinite_scroll"]/div[%d]//div[@class="img"]/a/img/@src'%i).extract()#查詢所有img標籤的src屬性,即獲取校花圖片地址name=hxs.select('//div[@class="item_list infinite_scroll"]/div[%d]//div[@class="img"]/span/text()'%i).extract()#獲取span的文字內容,即校花姓名school=hxs.select('//div[@class="item_list infinite_scroll"]/div[%d]//div[@class="img"]/div[@class="btns"]/a/text()'%i).extract()#校花學校ifsrc:ab_src="http://www.xiaohuar.com"+src[0]#相對路徑拼接file_name="%s_%s.jpg"%(school[0].encode('utf-8'),name[0].encode('utf-8'))#檔名,因為python27預設編碼格式是unicode編碼,因此我們需要編碼成utf-8file_path=os.path.join("/Users/wupeiqi/PycharmProjects/beauty/pic",file_name)urllib.urlretrieve(ab_src,file_path) |
注:urllib.urlretrieve(ab_src, file_path) ,接收檔案路徑和需要儲存的路徑,會自動去檔案路徑下載並儲存到我們指定的本地路徑。
5.遞迴爬取網頁
上述程式碼僅僅實現了一個url的爬取,如果該url的爬取的內容中包含了其他url,而我們也想對其進行爬取,那麼如何實現遞迴爬取網頁呢?
示例程式碼:
12345 | # 獲取所有的url,繼續訪問,並在其中尋找相同的urlall_urls=hxs.select('//a/@href').extract()forurl inall_urls:ifurl.startswith('http://www.xiaohuar.com/list-1-'):yield Request(url,callback=self.parse) |
即通過yield生成器向每一個url傳送request請求,並執行返回函式parse,從而遞迴獲取校花圖片和校花姓名學校等資訊。
注:可以修改settings.py 中的配置檔案,以此來指定“遞迴”的層數,如: DEPTH_LIMIT = 1
6.scrapy查詢語法中的正則:
123456789101112131415161718 | from scrapy.selector import Selectorfrom scrapy.http import HtmlResponsehtml="""<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title></title></head><body> <li class="item-"><a href="link.html">first item</a></li> <li class="item-0"><a href="link1.html">first item</a></li> <li class="item-1"><a href="link2.html">second item</a></li></body></html>"""response=HtmlResponse(url='http://example.com',body=html,encoding='utf-8')ret=Selector(response=response).xpath('//li[re:test(@class, "item-\d*")]//@href').extract()print(ret) |
- 語法規則:Selector(response=response查詢物件).xpath(‘//li[re:test(@class, “item-d*”)]//@href’).extract(),即根據re正則匹配,test即匹配,屬性名是class,匹配的正則表示式是”item-d*”,然後獲取該標籤的href屬性。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 | #!/usr/bin/env python# -*- coding:utf-8 -*-import scrapyimport hashlibfrom tutorial.items import JinLuoSiItemfrom scrapy.http import Requestfrom scrapy.selector import HtmlXPathSelectorclassJinLuoSiSpider(scrapy.spiders.Spider):count=0url_set=set()name="jluosi"domain='http://www.jluosi.com'allowed_domains=["jluosi.com"]start_urls=["http://www.jluosi.com:80/ec/goodsDetail.action?jls=QjRDNEIzMzAzOEZFNEE3NQ==",]def parse(self,response):md5_obj=hashlib.md5()md5_obj.update(response.url)md5_url=md5_obj.hexdigest()ifmd5_url inJinLuoSiSpider.url_set:passelse:JinLuoSiSpider.url_set.add(md5_url)hxs=HtmlXPathSelector(response)ifresponse.url.startswith('http://www.jluosi.com:80/ec/goodsDetail.action'):item=JinLuoSiItem()item['company']=hxs.select('//div[@class="ShopAddress"]/ul/li[1]/text()').extract()item['link']=hxs.select('//div[@class="ShopAddress"]/ul/li[2]/text()').extract()item['qq']=hxs.select('//div[@class="ShopAddress"]//a/@href').re('.*uin=(?P<qq>\d*)&')item['address']=hxs.select('//div[@class="ShopAddress"]/ul/li[4]/text()').extract()item['title']=hxs.select('//h1[@class="goodsDetail_goodsName"]/text()').extract()item['unit']=hxs.select('//table[@class="R_WebDetail_content_tab"]//tr[1]//td[3]/text()').extract()product_list=[]product_tr=hxs.select('//table[@class="R_WebDetail_content_tab"]//tr')foriinrange(2,len(product_tr)):temp={'standard':hxs.select('//table[@class="R_WebDetail_content_tab"]//tr[%d]//td[2]/text()'%i).extract()[0].strip(),'price':hxs.select('//table[@class="R_WebDetail_content_tab"]//tr[%d]//td[3]/text()'%i).extract()[0]
相關推薦教你分分鐘學會用python爬蟲框架Scrapy爬取心目中的女神Scrapy,Python開發的一個快速,高層次的螢幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結構化的資料。Scrapy用途廣泛,可以用於資料探勘、監測和自動化測試。 Scrapy吸引人的地方在於它是一個框架,任何人都可以根據需求方便的修改。它也提供了多種型別爬蟲 教你分分鐘學會用python爬蟲框架Scrapy爬取你想要的內容python 爬蟲 Scrapy python爬蟲 教你分分鐘學會用python爬蟲框架Scrapy爬取心目中的女神 python爬蟲學習課程,下載地址:https://pan.baidu.com/s/1v6ik6YKhmqrqTCICmuceug 課程代碼原件:課程視頻:教你分分鐘學會用py 分分鐘學會用python爬蟲框架ScrapyScrapy主要包括了以下元件:引擎(Scrapy)用來處理整個系統的資料流處理, 觸發事務(框架核心)排程器(Scheduler)用來接受引擎發過來的請求, 壓入佇列中, 並在引擎再次請求的時候返回. 可以想像成一個URL(抓取網頁的網址或者說是連結)的優先佇列, 由它來決定下一個要抓取的網址是什麼, 同時 資料視覺化 三步走(一):資料採集與儲存,利用python爬蟲框架scrapy爬取網路資料並存儲前言 最近在研究python爬蟲,突然想寫部落格了,那就寫點東西吧。給自己定個小目標,做一個完整的簡單的資料視覺化的小專案,把整個相關技術鏈串聯起來,目的就是為了能夠對這塊有個系統的認識,具體設計思路如下: 1. 利用python爬蟲框架scr 【R語言 視覺化】我教你15分鐘學會用R畫各種統計圖data:2015-10-17 author:laidefa 有同學讓我開始教他R語言,就先分享點東西把。學習R的曲線是陡峭的,有人教你才是正道,沒人教你你至少要安靜學習三個月甚至遠遠不止,才會駕輕 python爬蟲,Scrapy爬取豆瓣電影《芳華》電影短評,分詞生成詞雲圖。專案github地址:https://github.com/kocor01/scrapy_cloud Python版本為3.6 自己寫的簡單架構《python爬蟲,爬取豆瓣電影《芳華》電影短評,分詞生成詞雲圖。》 這個是用Scrapy框架重新實現的 爬蟲 【爬蟲】Scrapy 爬取excel中500個網址首頁,使用Selenium模仿使用者瀏覽器訪問,將網頁title、url、文字內容組成的item儲存至json檔案建立含有網址首頁的excel檔案 host_tag_網站名稱_主域名_子域名.xlsx 編輯讀取excel檔案的工具類專案FileUtils 新建專案FileUtils 編輯file_utils.py # -*- coding: utf-8 -*- """ 教你1分鐘學會貼iPhone鋼化膜入手新iPhone後,大多果粉會給愛機貼個鋼化膜以防螢幕刮花,畢竟售價萬元的iPhone xs換個螢幕就要幾千塊。那麼如何給自己的新款iPhone貼膜呢,方法很簡單,下面綠豆就用圖文教程教你1分鐘學會貼iPhone鋼化膜。 以手上的iPhone XS和綠聯鋼化膜貼膜方法為 教你分分鐘爬取百度貼吧,新手可操作(附原始碼及解析)不要以為這個教程很難,其實非常容易上手。並且講解非常詳細。 原理:通過檢視原始碼扣出關鍵資料,然後將其儲存到本地txt檔案下。(一通百通 ,原理大多一樣。) 【新建一個BugBaidu.py檔案,然後將程式碼複製到裡面後,雙擊執行。將貼吧中樓主釋出的內容打包txt儲存到本地。】 學 教你分分鐘搞定Docker私有倉庫Registry一、什麼是Docker私有倉庫Registry 官方的Docker hub是一個用於管理公共映象的好地方,我們可以在上面找到我們想要的映象,也可以把我們自己的映象推送上去。但是,有時候我們的伺服器無法訪問網際網路,或者你不希望將自己的映象放到公網當中,那麼你就需要Docker Registry,它可以用來儲 10分鐘學會用python寫遊戲!Python其實很簡單!安裝pygame 本人電腦是windows 10、python3.6,pygame下載地址: https://pypi.python.org/pypi/Pygame/1.9.3 請自行下載對應python版本的 pygame 執行以下命令 &nb 一張圖助你分分鐘掌握用photoshop將圖片轉化為背景透明的png技能-ps2017需求:將背景為白色的jpg轉化為背景透明的png;方法2:適用於背景色與實物色不一樣解鎖->複製圖層->選擇->色彩範圍->使用取色器選擇需要保留的顏色->確定->c 一分鐘學會用python畫心_turtle庫效果展示 turtle庫部分詳解請檢視本部落格 python_turtle庫部分詳解 對turtle 零基礎也可以輕鬆看懂程式碼 應用python的turtle庫,生成的圖片是動態的 import turtle t = turtle.Turtle() 教你十分鐘構建好 SpringBoot + SSM 框架控制器 默認 tid 持久 接口類 prepare color png intellij 目前最主流的 java web 框架應該是 SSM,而 SSM 框架由於更輕便與靈活目前受到了許多人的青睞。而 SpringBoot 的輕量化,簡化項目配置, 沒有 XML 配置要求等 一個月帶你入門Python爬蟲,輕鬆爬取大規模資料Python爬蟲為什麼受歡迎如果你仔細觀察,就不難發現,懂爬蟲、學習爬蟲的人越來越多,一方面,網 python 爬蟲實戰4 爬取淘寶MM照片寫真 換行符 rip 多行 get sts tool -o true 本篇目標 抓取淘寶MM的姓名,頭像,年齡 抓取每一個MM的資料簡介以及寫真圖片 把每一個MM的寫真圖片按照文件夾保存到本地 熟悉文件保存的過程 1.URL的格式 在這裏我們用到的URL是 http:/ Python爬蟲框架Scrapy實例(二)head sports spi 工作目錄 http 鏈接 進入 效果 tex 目標任務:使用Scrapy框架爬取新浪網導航頁所有大類、小類、小類裏的子鏈接、以及子鏈接頁面的新聞內容,最後保存到本地。 大類小類如下圖所示: 點擊國內這個小類,進入頁面後效果如下圖(部分截圖) python爬蟲--打開爬取頁面PE brush OS htm tab quest replace %s class def requests_view(response): import webbrowser requests_url = response.url base_u Python爬蟲入門 | 4 爬取豆瓣TOP250圖書信息Python 編程語言 Python爬蟲先來看看頁面長啥樣的:https://book.douban.com/top250 我們將要爬取哪些信息:書名、鏈接、評分、一句話評價……1. 爬取單個信息我們先來嘗試爬取書名,利用之前的套路,還是先復制書名的xpath:得到第一本書《追風箏的人》的書名xpath如下: python 爬蟲 requests+BeautifulSoup 爬取巨潮資訊公司概況代碼實例pan 字符 selenium 5.0 target 自我 color list tails 第一次寫一個算是比較完整的爬蟲,自我感覺極差啊,代碼low,效率差,也沒有保存到本地文件或者數據庫,強行使用了一波多線程導致數據順序發生了變化。。。 貼在這裏,引以為戒吧。 # |