1. 如何在scrapy框架下用python爬取json文件
import json
str = str[(str.find('(')+1):str.rfind(')')] #去掉首尾的圓括弧前後部分
dict = json.loads(str)
comments = dict['comments']
#然後for一下就行了
2. python scrapy 怎麼將爬取的內容寫出
首先,安裝Python,坑太多了,一個個爬。由於我是windows環境,沒錢買mac, 在安裝的時候遇到各種各樣的問題,確實各種各樣的依賴。安裝教程不再贅述。如果在安裝的過程中遇到 ERROR:需要windows c/c++問題,一般是由於缺少windows開發編譯環境,晚上大多數教程是安裝一個VisualStudio,太不靠譜了,事實上只要安裝一個WindowsSDK就可以了。下面貼上我的爬蟲代碼:
爬蟲主程序:
[python]view plain
#-*-coding:utf-8-*-
importscrapy
fromscrapy.httpimportRequest
fromzjf.FsmzItemsimportFsmzItem
fromscrapy.selectorimportSelector
#圈圈:情感生活
classMySpider(scrapy.Spider):
#爬蟲名
name="MySpider"
#設定域名
allowed_domains=["nvsheng.com"]
#爬取地址
start_urls=[]
#flag
x=0
#爬取方法
defparse(self,response):
item=FsmzItem()
sel=Selector(response)
item['title']=sel.xpath('//h1/text()').extract()
item['text']=sel.xpath('//*[@class="content"]/p/text()').extract()
item['imags']=sel.xpath('//div[@id="content"]/p/a/img/@src|//div[@id="content"]/p/img/@src').extract()
ifMySpider.x==0:
page_list=MySpider.getUrl(self,response)
forpage_singleinpage_list:
yieldRequest(page_single)
MySpider.x+=1
yielditem
#init:動態傳入參數
#命令行傳參寫法:scrapycrawlMySpider-astart_url="e_url"
def__init__(self,*args,**kwargs):
super(MySpider,self).__init__(*args,**kwargs)
self.start_urls=[kwargs.get('start_url')]
defgetUrl(self,response):
url_list=[]
select=Selector(response)
page_list_tmp=select.xpath('//div[@class="viewnewpages"]/a[not(@class="next")]/@href').extract()
forpage_tmpinpage_list_tmp:
ifpage_tmpnotinurl_list:
url_list.append("px/"+page_tmp)
returnurl_list
- PipeLines類
#-*-coding:utf-8-*-
#Defineyouritempipelineshere
#
#Don'_PIPELINESsetting
fromzjfimportsettings
importjson,os,re,random
importurllib.request
importrequests,json
fromrequests_toolbelt.multipart.encoderimportMultipartEncoder
classMyPipeline(object):
flag=1
post_title=''
post_text=[]
post_text_imageUrl_list=[]
cs=[]
user_id=''
def__init__(self):
MyPipeline.user_id=MyPipeline.getRandomUser('37619,18441390,18441391')
#processthedata
defprocess_item(self,item,spider):
#獲取隨機user_id,模擬發帖
user_id=MyPipeline.user_id
#獲取正文text_str_tmp
text=item['text']
text_str_tmp=""
forstrintext:
text_str_tmp=text_str_tmp+str
#print(text_str_tmp)
#獲取標題
ifMyPipeline.flag==1:
title=item['title']
MyPipeline.post_title=MyPipeline.post_title+title[0]
#保存並上傳圖片
text_insert_pic=''
text_insert_pic_w=''
text_insert_pic_h=''
forimag_urlinitem['imags']:
img_name=imag_url.replace('/','').replace('.','').replace('|','').replace(':','')
pic_dir=settings.IMAGES_STORE+'%s.jpg'%(img_name)
urllib.request.urlretrieve(imag_url,pic_dir)
#圖片上傳,返回json
upload_img_result=MyPipeline.uploadImage(pic_dir,'image/jpeg')
#獲取json中保存圖片路徑
text_insert_pic=upload_img_result['result']['image_url']
text_insert_pic_w=upload_img_result['result']['w']
text_insert_pic_h=upload_img_result['result']['h']
#拼接json
ifMyPipeline.flag==1:
cs_json={"c":text_str_tmp,"i":"","w":text_insert_pic_w,"h":text_insert_pic_h}
else:
cs_json={"c":text_str_tmp,"i":text_insert_pic,"w":text_insert_pic_w,"h":text_insert_pic_h}
MyPipeline.cs.append(cs_json)
MyPipeline.flag+=1
returnitem
#spider開啟時被調用
defopen_spider(self,spider):
pass
#sipder關閉時被調用
defclose_spider(self,spider):
strcs=json.mps(MyPipeline.cs)
jsonData={"apisign":"","user_id":MyPipeline.user_id,"gid":30,"t":MyPipeline.post_title,"cs":strcs}
MyPipeline.uploadPost(jsonData)
#上傳圖片
defuploadImage(img_path,content_type):
"uploadImagefunctions"
#UPLOAD_IMG_URL="dpostimage"
UPLOAD_IMG_URL="oadpostimage"
#傳圖片
#imgPath='D:picshttp___img_nvsheng_com_uploads_allimg_170119_18-1f1191g440_jpg.jpg'
m=MultipartEncoder(
#fields={'user_id':'192323',
#'images':('filename',open(imgPath,'rb'),'image/JPEG')}
fields={'user_id':MyPipeline.user_id,
'apisign':'',
'image':('filename',open(img_path,'rb'),'image/jpeg')}
)
r=requests.post(UPLOAD_IMG_URL,data=m,headers={'Content-Type':m.content_type})
returnr.json()
defuploadPost(jsonData):
CREATE_POST_URL="hmagespost"
reqPost=requests.post(CREATE_POST_URL,data=jsonData)
defgetRandomUser(userStr):
user_list=[]
user_chooesd=''
foruser_idinstr(userStr).split(','):
user_list.append(user_id)
userId_idx=random.randint(1,len(user_list))
user_chooesd=user_list[userId_idx-1]
returnuser_chooesd
- 欄位保存Items類
#-*-coding:utf-8-*-
#
#
#Seedocumentationin:
importscrapy
classFsmzItem(scrapy.Item):
#:
#name=scrapy.Field()
title=scrapy.Field()
#tutor=scrapy.Field()
#strongText=scrapy.Field()
text=scrapy.Field()
imags=scrapy.Field()
- 在命令行里鍵入
- scrapy crawl MySpider -a start_url="www.aaa.com"
[python]view plain
[python]view plain
[python]view plain
[python]view plain
這樣就可以爬取aaa.com下的內容了
3. 用scrapy進行數據爬取,為什麼我相同的代碼,運行結構卻不同
Scrapy,Python開發的一個快速,高層次的屏幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結構化的數據。Scrapy用途廣泛,可以用於數據挖掘、監測和自動化測試。
Scrapy吸引人的地方在於它是一個框架,任何人都可以根據需求方便的修改。它也提供了多種類型爬蟲的基類,如BaseSpider、sitemap爬蟲等,最新版本又提供了web2.0爬蟲的支持。
4. scrapy 爬蟲怎麼能夠只寫一個通用spider,然後利用參數去順序爬取很多個站點
說實話這個很難,因為不同站點的html相差很大,基本上是不可能說用一個通用spider去爬取的,除非你爬取的目標本來就是整個網頁頁面,但這樣子就成了搜索引擎那樣的爬蟲了
5. 基於python的scrapy爬蟲,關於增量爬取是怎麼處理的
new to scrapy, 僅提供幾個思路,詳細解決方案,自己解決後後續跟進。
如果只是一次性的抓取某個網站的全部內容, 中途需要暫停並且恢復,只需要
scrapy crawl somespider -s JOBDIR=crawls/somespider-1參考:Jobs: pausing and resuming crawls
如果需求是過濾某些url,但是網站的主入口不被過濾掉,比如典型的論壇類網站,你只想過濾掉帖子,但是卻不想過濾掉板塊,你可以定製一下requestSeen
如果使所有網站的動態過濾,比如是不是多了一個新回復,在url上的變化並不能體現出來,搜索引擎採用的是一系列的演算法,判斷某一個頁面的更新時機。個人應用一般不會使用到(其實是自己也不懂,寫出來提供一下思路,也許你會呢)。大部分的網頁在進入下一級頁面的時候都會有一個類似於最後更新時間,最後活動時間等等,可以根據這個來進行判斷。
scrapy/pefilter.py at 0.24 · scrapy/scrapy · GitHub
python - how to filter plicate requests based on url in scrapy
6. 如何通過軟體抓取新浪財經里單只股票數據
如果你是准備抓歷史數據,那還不如直接使用免費的wdz程序,滬深1990年至今的全部日線歷史;2000年至今十幾年的5分鍾數據都可以直接輸出,而且可轉化為各種格式。根本不用去新浪中抓取。
7. 如何用python 爬蟲抓取金融數據
獲取數據是數據分析中必不可少的一部分,而網路爬蟲是是獲取數據的一個重要渠道之一。鑒於此,我拾起了Python這把利器,開啟了網路爬蟲之路。
本篇使用的版本為python3.5,意在抓取證券之星上當天所有A股數據。程序主要分為三個部分:網頁源碼的獲取、所需內容的提取、所得結果的整理。
一、網頁源碼的獲取
很多人喜歡用python爬蟲的原因之一就是它容易上手。只需以下幾行代碼既可抓取大部分網頁的源碼。
為了減少干擾,我先用正則表達式從整個頁面源碼中匹配出以上的主體部分,然後從主體部分中匹配出每隻股票的信息。代碼如下。
pattern=re.compile('<tbody[sS]*</tbody>')
body=re.findall(pattern,str(content)) #匹配<tbody和</tbody>之間的所有代碼pattern=re.compile('>(.*?)<')
stock_page=re.findall(pattern,body[0]) #匹配>和<之間的所有信息
其中compile方法為編譯匹配模式,findall方法用此匹配模式去匹配出所需信息,並以列表的方式返回。正則表達式的語法還挺多的,下面我只羅列所用到符號的含義。
語法 說明
. 匹配任意除換行符「 」外的字元
* 匹配前一個字元0次或無限次
? 匹配前一個字元0次或一次
s 空白字元:[<空格> fv]
S 非空白字元:[^s]
[...] 字元集,對應的位置可以是字元集中任意字元
(...) 被括起來的表達式將作為分組,裡面一般為我們所需提取的內容
正則表達式的語法挺多的,也許有大牛隻要一句正則表達式就可提取我想提取的內容。在提取股票主體部分代碼時發現有人用xpath表達式提取顯得更簡潔一些,看來頁面解析也有很長的一段路要走。
三、所得結果的整理
通過非貪婪模式(.*?)匹配>和<之間的所有數據,會匹配出一些空白字元出來,所以我們採用如下代碼把空白字元移除。
stock_last=stock_total[:] #stock_total:匹配出的股票數據for data in stock_total: #stock_last:整理後的股票數據
if data=='':
stock_last.remove('')
最後,我們可以列印幾列數據看下效果,代碼如下
print('代碼',' ','簡稱',' ',' ','最新價',' ','漲跌幅',' ','漲跌額',' ','5分鍾漲幅')for i in range(0,len(stock_last),13): #網頁總共有13列數據
print(stock_last[i],' ',stock_last[i+1],' ',' ',stock_last[i+2],' ',' ',stock_last[i+3],' ',' ',stock_last[i+4],' ',' ',stock_last[i+5])
8. 怎麼抓取股票數據
那麼中國股市的數據有沒有呢?答案是肯定的,不過要按照下面的參數做些調整,下面提供全球證券交易所的資料。
上證股票是股票代碼後面加上.ss,深證股票是股票代碼後面加上.sz
例如:000001 = 000001.sz
深市數據鏈接:http://table.finance.yahoo.com/table.csv?s=000001.sz
上市數據鏈接:http://table.finance.yahoo.com/table.csv?s=600000.ss
上證綜指代碼:000001.ss,深證成指代碼:399001.SZ,滬深300代碼:000300.ss
下面就是世界股票交易所的網址和縮寫,要查找哪個股票交易所的數據,就按照上面的格式以此類推。
上海交易所=cn.finance.yahoo.com,.SS,Chinese,sl1d1t1c1ohgv
深圳交易所=cn.finance.yahoo.com,.SZ,Chinese,sl1d1t1c1ohgv
美國交易所=finance.yahoo.com,,United States,sl1d1t1c1ohgv
加拿大=ca.finance.yahoo.com,.TO,Toronto,sl1d1t1c1ohgv
紐西蘭=au.finance.yahoo.com,.NZ,sl1d1t1c1ohgv
新加坡=sg.finance.yahoo.com,.SI,Singapore,sl1d1t1c1ohgv
香港=hk.finance.yahoo.com,.HK,Hong Kong,sl1d1t1c1ohgv
台灣=tw.finance.yahoo.com,.TW,Taiwan,sl1d1t1c1ohgv
印度=in.finance.yahoo.com,.BO,Bombay,sl1d1t1c1ohgv
倫敦=uk.finance.yahoo.com,.L,London,sl1d1t1c1ohgv
澳洲=au.finance.yahoo.com,.AX,Sydney,sl1d1t1c1ohgv
巴西=br.finance.yahoo.com,.SA,Sao Paulo,sl1d1t1c1ohgv
瑞典=se.finance.yahoo.com,.ST,Stockholm,sl1d1t1c1ohgv
以上方法只能提供歷史數據,實時數據不能抓取,此方法由ArthurXF提供
9. 如何用python抓取股票數據
在 Python的QSTK中,是通過 s_datapath 變數,定義相應股票數據所在的文件夾。一般可以通過 QSDATA 這個環境變數來設置對應的數據文件夾。
具體的股票數據來源,例如滬深、港股等市場,你可以使用免費的WDZ程序輸出相應日線、5分鍾數據到 s_datapath 變數所指定的文件夾中。然後可使用 Python的QSTK中,qstkutil.DataAccess進行數據訪問。
10. 如何用爬蟲抓取股市數據並生成分析報表
1. 關於數據採集
股票數據是一種標准化的結構數據,是可以通過API介面訪問的(不過一般要通過渠道,開放的API有一定的局限性)。也可以通過爬蟲軟體進行採集,但是爬蟲軟體採集數據不能保證實時性,根據數據量和採集周期,可能要延遲幾十秒到幾分鍾不等。我們總結了一套專業的爬蟲技術解決方案(Ruby + Sidekiq)。能夠很快實現這個採集,也可以後台可視化調度任務。
2. 關於展現
網路股票數據的展現,網頁端直接通過HTML5技術就已經足夠,如果對界面要求高一點,可以採用集成前端框架,如Bootstrap;如果針對移動端開發, 可以使用Ionic框架。
3. 關於觸發事件
如果是採用Ruby on Rails的開發框架的話,倒是很方便了,有如sidekiq, whenever這樣子的Gem直接實現任務管理和事件觸發。