かなりの間、私はスクラップハブを使用しています。私は毎日仕事をするスパイダーをいくつか持っています。毎週末、私はスクレイプされたデータを収集するためサインインします。だから、私は一度に7つのジョブ以上に1つのクモ1を開く必要があります、データをダウンロードし、次の、次のスパイダー、などに移動します。 完成したスパイダーのジョブの抽出データを一度にすべて取得する方法はありますか?scrapinghub:完了したすべてのジョブからすべてのアイテムをダウンロードする
2
A
答えて
1
私は何をすると、私はVARIOSを削るこの1つのペットのプロジェクトを持っている...そう、あなたはカールすることができますあなたがパイソンに精通しているので、もし私がそれを使用することをお勧めし、https://doc.scrapinghub.com/api/items.html#item-object
使用scrapinghubパイソンAPIクライアント・インターフェースでありますビデオのタイトル、ストリームのURL +カテゴリを取得するビデオホスティングサイト(scraperが呼び出すかどうかに応じて)... scrapinghubにデプロイし、次にshubs api(Pythonベース)を使用して、辞書のような項目を繰り返して.m3uプレイリストを作成します。
私の場合はvlcプレーヤーを使用して、1つのプレイリスト内のすべてのビデオを集約することを目的としています。
場合は相続人スクラップコードsnipet(NOT私の実際のプロジェクトのアプリ)
from __future__ import print_function
from scrapinghub import Connection
import os
conn = Connection('YOURAPIKEYGOESHERE')
#179923/1/1
list = conn.project_ids()
print("PROJECTS")
print("-#-" * 30)
for index, item in enumerate(list[1::]):
index = str(index)
item = str(item)
project = conn[item]
pspi = project.spiders()
jobs = project.jobs()
for x in pspi:
print("["+ index + "] | PROJECT ID " + item, x['id'], x['tags'])
print("-#-" * 30)
print(list[0:4])
print(list[4:8])
print(list[8:12])
print(list[12:16])
print(list[16:20])
print(list[20:24])
print("-#-" * 30)
project = conn['180064'] #Manually Inserted
print("CONNECTING 2 |" + project.id)
print(project)
print("-#-" * 30)
pspi = project.spiders()
for x in pspi:
print(x)
print("-#-" * 30)
jobs = project.jobs()
print(jobs)
for job in jobs:
print(job)
job = project.job(u'180064/3/1') #Manually Inserted
print(job)
print("ITEMS")
print("-#-" * 30)
itemCount = job.info['items_scraped']
print("Items Scraped: {}".format(itemCount))
print(job.info['items_scraped'])
print("-#-" * 30)
def printF():
ipr = input("Do you wish to print? [y/n] \n")
if ipr == "y":
name = input("what is the name of project?\n")
print("-#-" * 30)
print("Printing intems to m3u")
print("-#-" * 30)
for item in job.items():
with open(name +'.m3u', 'a') as f:
f.write('#EXTINF:0, ' + str(item['title']) + '\n' + str(item['vidsrc']) + '\n')
f.close()
infile = name + ".m3u"
outfile = name + "_clean.m3u"
delete_list = ["['", "']"]
fin = open(infile)
fout = open(outfile, "w+")
for line in fin:
for word in delete_list:
line = line.replace(word, "")
fout.write(line)
fin.close()
fout.close()
else:
print("Not printing")
0
これが私の最後のコード
これは魅力のおかげのように動作します#!/usr/bin/python
# coding=utf-8
from scrapinghub import ScrapinghubClient
import unicodecsv as csv
import os
import logging
import pandas as pd
import datetime
import pickle
# Create and configure logger
LOG_FORMAT = "%(levelname)s %(asctime)s - %(message)s"
logging.basicConfig(level = logging.INFO,
format = LOG_FORMAT,
filemode = 'w')
logger = logging.getLogger()
logger.info("Starting downloading")
# Enter ScrapingHub
apikey = '........' # your API key as a string
client = ScrapinghubClient(apikey)
projectID = .......
project = client.get_project(projectID)
# # Give me a list of dictionaries with info (each for every spider i have)
spider_dicts_list = project.spiders.list()
for spider_dict in spider_dicts_list:
# # Extract from the list the id of my spider
spiderID = spider_dict["id"]
logger.info("Working with spider: " + spiderID)
# Get that spider and assign it to the object "spider"
spider = project.spiders.get(spiderID)
# Get a generator object for the jobs of that spider
jobs_summary = spider.jobs.iter()
# Generate all job keys using the generator object
job_keys = [j['key'] for j in jobs_summary]
for job_key in job_keys:
# Get the corresponding job from the key, as "job"
job = project.jobs.get(job_key)
# Check to see if the job was completed
if job.metadata.get(u'close_reason') == u'finished':
# Create an empty list that will store all items (dictionaries)
itemsDataFrame = pd.DataFrame()
for item_aggelia in job.items.iter():
# Save all items (dictionaries) to the DataFrame
itemsDataFrame = itemsDataFrame.append(item_aggelia, ignore_index=True)
job_key_name = job_key.split("/")[2]
# Export a pickle
# Check that the list is not empty
if not itemsDataFrame.empty:
for meta in job.metadata.iter():
if meta[0] == u"scrapystats":
timestamp = meta[1][u'finish_time']/1000.0
dt = datetime.datetime.fromtimestamp(timestamp)
filename = spiderID+" "+str(dt.year)+"-"+str(dt.month)+"-"+str(dt.day)+" "+str(dt.hour)+"_"+str(dt.minute)+"_"+str(dt.second)+" "+'Items.pickle'
directory = u"E:/Documents/OneDrive/4_Προγραμματισμός/Scrapy/Αγορά Ακινήτων/"+spiderID+u"/Αρχεία_pd.DataFrame"
os.chdir(directory)
with open(filename, 'w') as file:
pickle.dump(itemsDataFrame,file)
# Check for empty fields
colList = itemsDataFrame.columns.tolist()
for col in colList:
if itemsDataFrame[col].isnull().all():
logger.warning("Found Null Field, in job " + job_key_name +": " + col)
# Delete the job from ScrapingHub
logger.debug("Deleting job " + job_key_name)
job.delete()
else:
logger.info("Found a job that didn't finish properly. Job key: " + job_key+". close_reason:" + job.metadata.get(u'close_reason'))
関連する問題
- 1. すべてのジョブが完了した後のLaravelキューのポーリング
- 2. すべてのダウンロードが完了した後に関数をトリガーする方法
- 3. すべて完了した後にSelenium WebDriverが終了する
- 4. すべてのジョブが完了するまで、Muleでポーリングする方法
- 5. すべてのジョブが完了したらGoogle DataProcクラスタを自動的にシャットダウンします
- 6. すべての活動を完了
- 7. 完了のすべての活動
- 8. すべてのサービスコールが完了したときのトリガーメソッド
- 9. Specflow - すべてのテストが完了したらブラウザを閉じます
- 10. スプリングブートアプリケーションは、すべてのタスクが完了した後
- 11. タスク。タスクが完了する前にすべて終了する
- 12. リストからすべてのアイテム
- 13. 一度にすべてのPodioアイテムIDをダウンロードする方法
- 14. コマンドキューがエンキューされたすべてのジョブを完了するまで待ちます
- 15. すべてを選択した場合に完了したレコードと完了していないレコードを表示
- 16. 上記のすべての行のすべてのドロップダウンの選択を完了した後の次の行
- 17. laravelジョブが完了したら表示を戻しますか?
- 18. Bash:すべてのサブフォルダでファイル名補完を完了
- 19. NSOperationQueueはすべてのタスクを完了します。swift 3
- 20. Selenium WebdriverとFirefoxですべてのダウンロードが完了したことを検出する方法
- 21. BindingSourceのすべてのバインディングが完了した時点を判断する
- 22. Python - キューからのすべてのタスクが完了したかどうかを確認する
- 23. すべてのマッパーが終了したときにのみジョブを減らしますか?
- 24. JQueryですべてのajax呼び出しが完了すると、各ループは完了しますか?
- 25. すべてのスレッドが1つのジョブを終了してから別のジョブを終了するまで待ちます
- 26. すべてが完了したらブラウザを終了する代わりにスクレーパーがエラーをスローする
- 27. 複数のダウンロードを実行し、すべてが完了するのを待ちます
- 28. Paperclipのダウンロードが完了したら、わかりますか?
- 29. C# - ファイルのダウンロードが完了したら何かします
- 30. すべてのサブプロセスが完了するまでプロセスを待機しますか?
です! – joeydebreuk