今天發生一個怪問題, 在使用ISNULL轉換一個欄位Segment時, 一直轉不過來, 出現錯誤

Conversion failed when converting the varchar value ‘ISNULL’ to data type int

但是我查看PB的欄位是NVARCHAR, 所以原因應該就是Source


就只有兩種方法: 照下面方法可以成功

如果沒有成功, 請檢查一下你的錯誤是否發生在你的yield內

一, 使用Feed Export導出

通過從命令行設置文件名和所需格式來運行爬蟲並存儲數據。

如果您希望自定義輸出並在爬蟲運行時生成結構化Json或CSV。

您可以使用Item Pipeline管道中設置輸出屬性,而不是從命令行設置。

scrapy crawl myspider -o data.jsonscrapy crawl myspider -o data.csvscrapy crawl myspider -o data.xml

Scrapy有自己的內置工具來生成json,csv,xml和其他序列化格式

二, 使用Item Pipeline導出

Scrapy Item Pipeline是一種處理數據的通用工具。

典型的用法是清理html,驗證已刪除的數據,刪除重複數據並將數據存儲在數據庫中。

如果您想要一個方便且可自定義的過程來存儲數據,則可以使用管道。

您需要使用JsonItemExporter:

from scrapy.exporters import JsonItemExporterclass JsonPipeline(object):def __init __(self):
self.file = open(“books.json”,'wb')
self.exporter = JsonItemExporter(self.file,encoding ='utf-8',ensure_ascii = False)
self.exporter.start_exporting()
def close_spider(self,spider):
self.exporter.finish_exporting()
self.file.close()
def process_item(self,item,spider):
self.exporter.export_item(item)
return item

除了JsonItemExporter,還有CsvItemExporter,它與CSV的工作方式相同,但您必須調用CsvItemExporter:

class CsvPipeline(object):def __init __(self):
self.file = open(“booksdata.csv”,'wb')
self.exporter = CsvItemExporter(self.file,unicode)
self.exporter.start_exporting()
def close_spider( self,spider):
self.exporter.finish_exporting()
self.file.close()
def process_item(self,item,spider):
self.exporter.export_item(item)
return item

請注意,在csv文件中,默認情況下,字段用“,”(逗號)分隔。如果您的字段包含帶逗號的文本,這會破壞整個結構,您可能需要創建一個修復此問題的函數:

def create_valid_csv(self, item):
for key, value in item.items():
is_string = (isinstance(value, basestring))
if (is_string and ("," in value.encode('utf-8'))):
item[key] = "\"" + value + "\""

您必須在導出項目之前調用此函數,以便ItemExporter相應地識別數據中的逗號。

配置settings.py

告訴scrapy你使用的管道非常重要,否則你的管道將不會被調用。

您必須將下面的代碼添加到Scrapy項目中的settings.py中:

ITEM_PIPELINES = { 
'RedditScraper.pipelines.JsonPipeline':300,
'RedditScraper.pipelines.CsvPipeline':500,
}

這些數字的含義是管道執行的優先級。在此示例中,JsonPipeline將更快執行。並且數字必須在0–1000的範圍內。

參考來源:

https://docs.scrapy.org/en/latest/topics/exporters.html

https://ithelp.ithome.com.tw/articles/10206612


使用/, 記得需要"數字類型"(字串就需要轉換一下型態)才可以操作.

更詳細內容, 可以參考.

比較 Python 與除法相關的運算子與函式 — /、//、% 與 divmod


做資料處理時, 有時候會遇到爬到的資料太大, 又不想在程式碼上做處理.

就可以利用PilitEdit將檔案打開檢視摟!

PilotEdit


要顯示的資料太大, 需調整Juypter notebook的設定

Try this:

jupyter notebook --NotebookApp.iopub_data_rate_limit=1.0e10

Or this:

yourTerminal:prompt> jupyter notebook --NotebookApp.iopub_data_rate_limit=1.0e10

參考來源:

https://stackoverflow.com/questions/43288550/iopub-data-rate-exceeded-in-jupyter-notebook-when-viewing-image


不使用with, 需要手動close

# 以附加寫入模式開啟檔案
f = open("output.txt", "a")

f.write("這是要寫入的資料\n")
f.write("這是第二行資料\n")

f.close()
f = open("output.txt", "w")

# 以 print 寫入資料
print("這是要寫入的資料\n", file = f)
print("這是第二行資料\n", file = f)

f.close()
f = open("output.txt", "w")

# 多行資料
lines = ["第一行\n", "第二行\n", "第三行\n"]

# 一次寫入多行資料
f.writelines(lines)

f.close()

使用with, 不需手動close

var = "Some text to write in the file."

with open("Output.txt", "w") as text_file:
text_file.write("String Variable: %s" % var)
var = "Some text to be written to the file."

with open("Output.txt", "w") as txtfile:
print("String Variable: {}".format(var), file=txtfile)

Output.txt 檔案:

String Variable: Some text to be written to the file.

參考來源:

https://www.delftstack.com/zh-tw/howto/python/write-string-to-a-file-in-python/


這是因為你在寫頭部的時候加入了空格,例:

headers={
‘Host’ : ‘ 123.206.31.85:49167’,
‘User-Agent’ : ‘ Mozilla/5.0 (Windows NT 10.0; WOW64; rv:65.0) Gecko/20100101 Firefox/65.0’,
‘Accept’ : ‘ text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8’,
‘Accept-Language’ : ‘ zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2’,
‘Referer’ : ‘ http://123.206.31.85:49167/',
‘Content-Type’ : ‘ application/x-www-form-urlencoded’,
‘Content-Length’: ‘ 87’,
‘Cookie’ : ‘ PHPSESSID=qij0np73li9nmm1rog8vo5dm76’,
‘Connection’ : ‘ keep-alive’,
‘Upgrade-Insecure-Requests’ : ‘ 1’
}
然而正確的格式是,在’Host’ 後面的值裡前面不應帶有空格,如:

headers={
‘Host’ : ‘123.206.31.85:49167’,
‘User-Agent’ : ‘Mozilla/5.0 (Windows NT 10.0; WOW64; rv:65.0) Gecko/20100101 Firefox/65.0’,
‘Accept’ : ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8’,
‘Accept-Language’ : ‘zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2’,
‘Referer’ : ‘http://123.206.31.85:49167/',
‘Content-Type’ : ‘application/x-www-form-urlencoded’,
‘Content-Length’: ‘87’,
‘Cookie’ : ‘PHPSESSID=qij0np73li9nmm1rog8vo5dm76’,
‘Connection’ : ‘keep-alive’,
‘Upgrade-Insecure-Requests’ : ‘1’
}
參考來源:

https://blog.csdn.net/qq_42133828/article/details/86815176

Max技術仔

我是一名DBA/Data Engineering, 業餘時間也是Web Developer/Investor. 這裡主要筆記任何工作上遇到的任何問題與解決辦法. 若有幫助到你/妳,那是我最大的榮幸.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store