導航:首頁 > 編程語言 > pythonscrapy13

pythonscrapy13

發布時間:2022-05-27 05:48:22

㈠ 如何在scrapy框架下用python爬取json文件

生成Request的時候與一般的網頁是相同的,提交Request後scrapy就會下載相應的網頁生成Response,這時只用解析response.body按照解析json的方法就可以提取數據了。代碼示例如下(以京東為例,其中的parse_phone_price和parse_commnets是通過json提取的,省略部分代碼):

# -*- coding: utf-8 -*-
 
from scrapy.spiders import Spider, CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from jdcom.items import JdPhoneCommentItem, JdPhoneItem
from scrapy import Request
from datetime import datetime
import json
import logging
import re
 
logger = logging.getLogger(__name__)
 
 
class JdPhoneSpider(CrawlSpider):
    name = "jdPhoneSpider"
    start_urls = ["http://list.jd.com/list.html?cat=9987,653,655"]
 
    rules = (
        Rule(
            LinkExtractor(allow=r"list\.html\?cat\=9987,653,655\&page\=\d+\&trans\=1\&JL\=6_0_0"),
            callback="parse_phone_url",
            follow=True,
        ),
    )
 
    def parse_phone_url(self, response):
        hrefs = response.xpath("//div[@id='plist']/ul/li/div/div[@class='p-name']/a/@href").extract()
        phoneIDs = []
        for href in hrefs:
            phoneID = href[14:-5]
            phoneIDs.append(phoneID)
            commentsUrl = "http://sclub.jd.com/proctpage/p-%s-s-0-t-3-p-0.html" % phoneID
            yield Request(commentsUrl, callback=self.parse_commnets)
 
    def parse_phone_price(self, response):
        phoneID = response.meta['phoneID']
        meta = response.meta
        priceStr = response.body.decode("gbk", "ignore")
        priceJson = json.loads(priceStr)
        price = float(priceJson[0]["p"])
        meta['price'] = price
        phoneUrl = "http://item.jd.com/%s.html" % phoneID
        yield Request(phoneUrl, callback=self.parse_phone_info, meta=meta)
 
    def parse_phone_info(self, response):  
        pass
 
    def parse_commnets(self, response):
 
        commentsItem = JdPhoneCommentItem()
        commentsStr = response.body.decode("gbk", "ignore")
        commentsJson = json.loads(commentsStr)
        comments = commentsJson['comments']
 
        for comment in comments:
            commentsItem['commentId'] = comment['id']
            commentsItem['guid'] = comment['guid']
            commentsItem['content'] = comment['content']
            commentsItem['referenceId'] = comment['referenceId']
            # 2016-09-19 13:52:49  %Y-%m-%d %H:%M:%S
            datetime.strptime(comment['referenceTime'], "%Y-%m-%d %H:%M:%S")
            commentsItem['referenceTime'] = datetime.strptime(comment['referenceTime'], "%Y-%m-%d %H:%M:%S")
 
            commentsItem['referenceName'] = comment['referenceName']
            commentsItem['userProvince'] = comment['userProvince']
            # commentsItem['userRegisterTime'] = datetime.strptime(comment['userRegisterTime'], "%Y-%m-%d %H:%M:%S")
            commentsItem['userRegisterTime'] = comment.get('userRegisterTime')
            commentsItem['nickname'] = comment['nickname']
            commentsItem['userLevelName'] = comment['userLevelName']
            commentsItem['userClientShow'] = comment['userClientShow']
            commentsItem['proctColor'] = comment['proctColor']
            # commentsItem['proctSize'] = comment['proctSize']
            commentsItem['proctSize'] = comment.get("proctSize")
            commentsItem['afterDays'] = int(comment['days'])
            images = comment.get("images")
            images_urls = ""
            if images:
                for image in images:
                    images_urls = image["imgUrl"] + ";"
            commentsItem['imagesUrl'] = images_urls
        yield commentsItem
 
        commentCount = commentsJson["proctCommentSummary"]["commentCount"]
        goodCommentsCount = commentsJson["proctCommentSummary"]["goodCount"]
        goodCommentsRate = commentsJson["proctCommentSummary"]["goodRate"]
        generalCommentsCount = commentsJson["proctCommentSummary"]["generalCount"]
        generalCommentsRate = commentsJson["proctCommentSummary"]["generalRate"]
        poorCommentsCount = commentsJson["proctCommentSummary"]["poorCount"]
        poorCommentsRate = commentsJson["proctCommentSummary"]["poorRate"]
        phoneID = commentsJson["proctCommentSummary"]["proctId"]
 
        priceUrl = "http://p.3.cn/prices/mgets?skuIds=J_%s" % phoneID
        meta = {
            "phoneID": phoneID,
            "commentCount": commentCount,
            "goodCommentsCount": goodCommentsCount,
            "goodCommentsRate": goodCommentsRate,
            "generalCommentsCount": generalCommentsCount,
            "generalCommentsRate": generalCommentsRate,
            "poorCommentsCount": poorCommentsCount,
            "poorCommentsRate": poorCommentsRate,
        }
        yield Request(priceUrl, callback=self.parse_phone_price, meta=meta)
 
        pageNum = commentCount / 10 + 1
        for i in range(pageNum):
            commentsUrl = "http://sclub.jd.com/proctpage/p-%s-s-0-t-3-p-%d.html" % (phoneID, i)
            yield Request(commentsUrl, callback=self.parse_commnets)

㈡ python scrapy是什麼意思

Scrapy,Python開發的一個快速,高層次的屏幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結構化的數據。

㈢ python scrapy問題

你的錯誤信息貼的不全,是不是最後幾行有行 write(...., async=False) 的錯誤?如果是這個錯誤的話,你需要打這行代碼所在文件,把相關的async 改成 async1 或其它名稱,因為在新版本python中, async 是一個關鍵字,沖突了。

㈣ python中的scrapy是什麼意思a

Scrapy英文意思是刮擦
被用來命名爬蟲界知名的框架。
使用這個框架可以輕易實現常規網頁採集。也支持大型架構。升級後redis更是支持分布式。利用scrapyd更是可以發布服務。
從事爬蟲方向必學!

㈤ 如何在scrapy框架下,用python實現爬蟲自動跳轉頁面來抓去網頁內容

Scrapy是一個用Python寫的Crawler Framework,簡單輕巧,並且非常方便。Scrapy使用Twisted這個非同步網路庫來處理網路通信,架構清晰,並且包含了各種中間件介面,可以靈活地完成各種需求。Scrapy整體架構如下圖所示:

根據架構圖介紹一下Scrapy中的各大組件及其功能:

Scrapy引擎(Engine):負責控制數據流在系統的所有組建中流動,並在相應動作發生觸發事件。
調度器(Scheler):從引擎接收Request並將它們入隊,以便之後引擎請求request時提供給引擎。
下載器(Downloader):負責獲取頁面數據並提供給引擎,而後提供給Spider。
Spider:Scrapy用戶編寫用於分析Response並提取Item(即獲取到的Item)或額外跟進的URL的類。每個Spider負責處理一個特定(或一些網站)。
Item Pipeline:負責處理被Spider提取出來的Item。典型的處理有清理驗證及持久化(例如存儲到資料庫中,這部分後面會介紹存儲到MySQL中,其他的資料庫類似)。
下載器中間件(Downloader middlewares):是在引擎即下載器之間的特定鉤子(special hook),處理Downloader傳遞給引擎的Response。其提供了一個簡便的機制,通過插入自定義代碼來擴展Scrapy功能(後面會介紹配置一些中間並激活,用以應對反爬蟲)。
Spider中間件(Spider middlewares):是在引擎及Spider之間的特定鉤子(special hook),處理Spider的輸入(response)和輸出(Items即Requests)。其提供了一個簡便的機制,通過插入自定義的代碼來擴展Scrapy功能。

㈥ python怎麼安裝scrapy

安裝scrapy一般使用pip方式安裝,因此需要先安裝pip

  1. 如果未安裝pip,先安裝pip,網路搜索一下即可獲得py文件

    pythonget-pip.py
  2. 如果已安裝pip,則直接

pipinstallScrapy

在安裝過程中缺什麼就安裝什麼就好了

㈦ scrapy和python有什麼關系

Scrapy是Python開發的一個快速、高層次的web數據抓取框架,用於抓取web站點並從頁面中提取結構化的數據。Scrapy用途廣泛,可以用於數據挖掘和監測。

Scrapy吸引人的地方在於它是一個框架,任何人都可以根據需求方便的修改。它也提供了多種類型爬蟲的基類,如BaseSpider、sitemap爬蟲等。

Scrapy算得上是Python世界中最常用的爬蟲框架了,同時它也是我掌握的幾種流行語言中最好的爬蟲框架,沒有之一!我認為它也是最難學習的框架,同樣沒有之一。很多初學Scarpy的經常向我抱怨完全不清楚Scrapy該怎樣入手,即使看的是中文的文檔,也感到很難理解。我當初接觸Scrapy時也有這樣的感覺。之所以感到Scrapy難學,究其原因,是其官方文檔實在太過凌亂,又缺少實用的代碼例子,讓人看得雲里霧里,不知其所已然。雖然其文檔不良,但卻沒有遮擋住它的光輝,它依然是Python世界中目前最好用的爬蟲框架。其架構的思路、蜘蛛執行的效能,還有可擴展的能力都非常出眾,再配以Python語言的簡潔輕巧,使得爬蟲的開發事半功倍。

相關推薦:《Python基礎教程》

Scrapy的優點:

(1)提供了內置的HTTP緩存,以加速本地開發。

(2)提供了自動節演調節機制,而且具有遵守robots.txt的設置的能力。

(3)可以定義爬行深度的限制,以避免爬蟲進入死循環鏈接。

(4)會自動保留會話。

(5)執行自動HTTP基本認證。不需要明確保存狀態。

(6)可以自動填寫登錄表單。

(7)Scrapy有一個內置的中間件,可以自動設置請求中的引用(referrer)頭。

(8)支持通過3xx響應重定向,也可以通過HTML元刷新。

(9)避免被網站使用的meta重定向困住,以檢測沒有JS支持的頁面。

(10)默認使用CSS選擇器或XPath編寫解析器。

(11)可以通過Splash或任何其他技術(如Selenium)呈現JavaScript頁面。

(12)擁有強大的社區支持和豐富的插件和擴展來擴展其功能。

(13)提供了通用的蜘蛛來抓取常見的格式:站點地圖、CSV和XML。

(14)內置支持以多種格式(JSON、CSV、XML、JSON-lines)導出收集的數據並將其存在多個後端(FTP、S3、本地文件系統)中。

Scrapy框架原理

Scrapy Engine(引擎):負責Spider、ItemPipeline、Downloader、Scheler中間的通訊,信號、數據傳遞等。

Scheler(調度器):負責接收引擎發送過來的Request請求,並按照一定的方式進行整理排列,入隊,當引擎需要時,交還給引擎。

Downloader(下載器):負責下載Scrapy Engine(引擎)發送的所有Requests請求,並將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理,

Spider(爬蟲):負責處理所有Responses,從中分析提取數據,獲取Item欄位需要的數據,並將需要跟進的URL提交給引擎,再次進入Scheler(調度器),

Item Pipeline(管道):負責處理Spider中獲取到的Item,並進行進行後期處理(詳細分析、過濾、存儲等)的地方.

Downloader Middlewares(下載中間件):你可以當作是一個可以自定義擴展下載功能的組件。

Spider Middlewares(Spider中間件):你可以理解為是一個可以自定擴展和操作引擎和Spider中間通信的功能組件(比如進入Spider的Responses;和從Spider出去的Requests)

Scrapy各個組件介紹

·Scrapy Engine:

引擎負責控制數據流在系統中所有組件中流動,並在相應動作發生時觸發事件。它也是程序的入口,可以通過scrapy指令方式在命令行啟動,或普通編程方式實例化後調用start方法啟動。

·調度器(Scheler)

調度器從引擎接收爬取請求(Request)並將它們入隊,以便之後引擎請求它們時提供給引擎。一般來說,我們並不需要直接對調度器進行編程,它是由Scrapy主進程進行自動控制的。

·下載器(Down-loader)

下載器負責獲取頁面數據並提供給引擎,而後將網站的響應結果對象提供給蜘蛛(Spider)。具體點說,下載器負責處理產生最終發出的請求對象 Request 並將返回的響應生成 Response對象傳遞給蜘蛛。

·蜘蛛——Spiders

Spider是用戶編寫用於分析響應(Response)結果並從中提取Item(即獲取的Item)或額外跟進的URL的類。每個Spider負責處理一個特定(或一些)網站。

·數據管道——Item Pipeline

Item Pipeline 負責處理被 Spider 提取出來的 Item。 典型的處理有清理、驗證及持久化(例如,存取到資料庫中)。

·下載器中間件(Downloader middle-wares)

下載器中間件是在引擎及下載器之間的特定鉤子(specific hook),處理Downloader傳遞給引擎的Response。其提供了一個簡便的機制,通過插入自定義代碼來擴展Scrapy的功能。

·Spider中間件(Spider middle-wares)

Spider 中間件是在引擎及 Spider 之間的特定鉤子(specific hook),處理 Spider 的輸入(Response)和輸出(Items及Requests)。其提供了一個簡便的機制,通過插入自定義代碼來擴展Scrapy的功能。

從Scrapy的系統架構可見,它將整個爬網過程進行了非常具體的細分,並接管了絕大多數復雜的工作,例如,產生請求和響應對象、控制爬蟲的並發等。

㈧ 怎麼樣使用Python的Scrapy爬蟲框架

有些人問,開發網路爬蟲應該選擇Nutch、Crawler4j、WebMagic、scrapy、WebCollector還是其他的?這里按照我的經驗隨便扯淡一下:

上面說的爬蟲,基本可以分3類:

1.分布式爬蟲:Nutch

2.JAVA單機爬蟲:Crawler4j、WebMagic、WebCollector

3. 非JAVA單機爬蟲:scrapy

第一類:分布式爬蟲

爬蟲使用分布式,主要是解決兩個問題:

1)海量URL管理

2)網速

現在比較流行的分布式爬蟲,是Apache的Nutch。但是對於大多數用戶來說,Nutch是這幾類爬蟲里,最不好的選擇,理由如下:

1)Nutch是為搜索引擎設計的爬蟲,大多數用戶是需要一個做精準數據爬取(精抽取)的爬蟲。Nutch運行的一套流程里,有三分之二是為了搜索引擎而設計的。對精抽取沒有太大的意義。也就是說,用Nutch做數據抽取,會浪費很多的時間在不必要的計算上。而且如果你試圖通過對Nutch進行二次開發,來使得它適用於精抽取的業務,基本上就要破壞Nutch的框架,把Nutch改的面目全非,有修改Nutch的能力,真的不如自己重新寫一個分布式爬蟲框架了。

2)Nutch依賴hadoop運行,hadoop本身會消耗很多的時間。如果集群機器數量較少,爬取速度反而不如單機爬蟲快。

3)Nutch雖然有一套插件機制,而且作為亮點宣傳。可以看到一些開源的Nutch插件,提供精抽取的功能。但是開發過Nutch插件的人都知道,Nutch的插件系統有多蹩腳。利用反射的機制來載入和調用插件,使得程序的編寫和調試都變得異常困難,更別說在上面開發一套復雜的精抽取系統了。而且Nutch並沒有為精抽取提供相應的插件掛載點。Nutch的插件有隻有五六個掛載點,而這五六個掛載點都是為了搜索引擎服務的,並沒有為精抽取提供掛載點。大多數Nutch的精抽取插件,都是掛載在「頁面解析」(parser)這個掛載點的,這個掛載點其實是為了解析鏈接(為後續爬取提供URL),以及為搜索引擎提供一些易抽取的網頁信息(網頁的meta信息、text文本)。

4)用Nutch進行爬蟲的二次開發,爬蟲的編寫和調試所需的時間,往往是單機爬蟲所需的十倍時間不止。了解Nutch源碼的學習成本很高,何況是要讓一個團隊的人都讀懂Nutch源碼。調試過程中會出現除程序本身之外的各種問題(hadoop的問題、hbase的問題)。

5)很多人說Nutch2有gora,可以持久化數據到avro文件、hbase、mysql等。很多人其實理解錯了,這里說的持久化數據,是指將URL信息(URL管理所需要的數據)存放到avro、hbase、mysql。並不是你要抽取的結構化數據。其實對大多數人來說,URL信息存在哪裡無所謂。

6)Nutch2的版本目前並不適合開發。官方現在穩定的Nutch版本是nutch2.2.1,但是這個版本綁定了gora-0.3。如果想用hbase配合nutch(大多數人用nutch2就是為了用hbase),只能使用0.90版本左右的hbase,相應的就要將hadoop版本降到hadoop 0.2左右。而且nutch2的官方教程比較有誤導作用,Nutch2的教程有兩個,分別是Nutch1.x和Nutch2.x,這個Nutch2.x官網上寫的是可以支持到hbase 0.94。但是實際上,這個Nutch2.x的意思是Nutch2.3之前、Nutch2.2.1之後的一個版本,這個版本在官方的SVN中不斷更新。而且非常不穩定(一直在修改)。

所以,如果你不是要做搜索引擎,盡量不要選擇Nutch作為爬蟲。有些團隊就喜歡跟風,非要選擇Nutch來開發精抽取的爬蟲,其實是沖著Nutch的名氣(Nutch作者是Doug Cutting),當然最後的結果往往是項目延期完成。

如果你是要做搜索引擎,Nutch1.x是一個非常好的選擇。Nutch1.x和solr或者es配合,就可以構成一套非常強大的搜索引擎了。如果非要用Nutch2的話,建議等到Nutch2.3發布再看。目前的Nutch2是一個非常不穩定的版本。

㈨ python scrapy 怎麼將爬取的內容寫出

首先,安裝Python,坑太多了,一個個爬。由於我是windows環境,沒錢買mac, 在安裝的時候遇到各種各樣的問題,確實各種各樣的依賴。安裝教程不再贅述。如果在安裝的過程中遇到 ERROR:需要windows c/c++問題,一般是由於缺少windows開發編譯環境,晚上大多數教程是安裝一個VisualStudio,太不靠譜了,事實上只要安裝一個WindowsSDK就可以了。下面貼上我的爬蟲代碼:

爬蟲主程序:

[python]view plain

㈩ Python安裝Scrapy出現以下錯誤怎麼辦

.interface都是OK的。當importOpenSSL時出現錯誤提示:Traceback(mostrecentcalllast):File"",line1,inimportOpenSSLFile"D:\pythoninstall\lib\site-packages\OpenSSL__init__.py",line13,:DLLloadfailed:%1不是有效的Win32應用程序。我安裝的是pyOpenSSL-0.13.1.win-amd64-py2.7.exe缺少openssl相關的dll,或者你跟前幾天 群里的一位一樣,版本不匹配。如果你安裝的是32位Python,請不要使用64位庫。文件名里沒有amd64的安裝包就是32位的。

閱讀全文

與pythonscrapy13相關的資料

熱點內容
南京中興招收專科程序員嗎 瀏覽:297
代理商php源碼 瀏覽:983
蘋果手機怎麼解壓軟體app 瀏覽:650
游戲資源被編譯 瀏覽:152
代碼編譯後黑屏 瀏覽:8
程序員情侶寫真 瀏覽:505
python3孿生素數 瀏覽:36
計算楊輝三角Python 瀏覽:404
linux目錄重命名 瀏覽:196
演算法設計的最終形態是代碼 瀏覽:262
程序員社團招新橫幅 瀏覽:238
拖鞋解壓視頻大全 瀏覽:887
租伺服器主機鏈接軟體叫什麼 瀏覽:856
交叉編譯工具的linux版本號 瀏覽:156
python開發應用軟體 瀏覽:32
hdl綜合器與c編譯器的區別 瀏覽:899
編譯原理最左推導代碼 瀏覽:702
加密三 瀏覽:131
通過編譯鏈接後形成的可執行程序 瀏覽:680
怎麼用matlab編程 瀏覽:782