1. 程式人生 > >教你分分鐘學會用python爬蟲框架Scrapy爬取心目中的女神

教你分分鐘學會用python爬蟲框架Scrapy爬取心目中的女神

Scrapy,Python開發的一個快速,高層次的螢幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結構化的資料。Scrapy用途廣泛,可以用於資料探勘、監測和自動化測試。 Scrapy吸引人的地方在於它是一個框架,任何人都可以根據需求方便的修改。它也提供了多種型別爬蟲的基類,如BaseSpider、sitemap爬蟲等,最新版本又提供了web2.0爬蟲的支援。 Scratch,是抓取的意思,這個Python的爬蟲框架叫Scrapy,大概也是這個意思吧,就叫它:小刮刮吧。 Scrapy 使用了 Twisted非同步網路庫來處理網路通訊。整體架構大致如下

Scrapy主要包括了以下元件:

  • 引擎(Scrapy)
    用來處理整個系統的資料流處理, 觸發事務(框架核心)
  • 排程器(Scheduler)
    用來接受引擎發過來的請求, 壓入佇列中, 並在引擎再次請求的時候返回. 可以想像成一個URL(抓取網頁的網址或者說是連結)的優先佇列, 由它來決定下一個要抓取的網址是什麼, 同時去除重複的網址
  • 下載器(Downloader)
    用於下載網頁內容, 並將網頁內容返回給蜘蛛(Scrapy下載器是建立在twisted這個高效的非同步模型上的)
  • 爬蟲(Spiders)
    爬蟲是主要幹活的, 用於從特定的網頁中提取自己需要的資訊, 即所謂的實體(Item)。使用者也可以從中提取出連結,讓Scrapy繼續抓取下一個頁面
  • 專案管道(Pipeline)
    負責處理爬蟲從網頁中抽取的實體,主要的功能是持久化實體、驗證實體的有效性、清除不需要的資訊。當頁面被爬蟲解析後,將被髮送到專案管道,並經過幾個特定的次序處理資料。
  • 下載器中介軟體(Downloader Middlewares)
    位於Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應。
  • 爬蟲中介軟體(Spider Middlewares)
    介於Scrapy引擎和爬蟲之間的框架,主要工作是處理蜘蛛的響應輸入和請求輸出。
  • 排程中介軟體(Scheduler Middewares)
    介於Scrapy引擎和排程之間的中介軟體,從Scrapy引擎傳送到排程的請求和響應。

Scrapy執行流程大概如下:

  1. 引擎從排程器中取出一個連結(URL)用於接下來的抓取
  2. 引擎把URL封裝成一個請求(Request)傳給下載器
  3. 下載器把資源下載下來,並封裝成應答包(Response)
  4. 爬蟲解析Response
  5. 解析出實體(Item),則交給實體管道進行進一步的處理
  6. 解析出的是連結(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 p1your_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爬蟲框架Scrapy

Scrapy主要包括了以下元件:引擎(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 excel500個網址首頁,使用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,效率差,也沒有保存到本地文件或者數據庫,強行使用了一波多線程導致數據順序發生了變化。。。 貼在這裏,引以為戒吧。 #