這幾天幫朋友寫一個爬蟲程序,獲取產品類目信息,過程中發現幾個問題記錄下來
文章目錄
輸出
寫入CSV
開始直接用逗號拼接直接保存文本文件,後來發現數據中包含逗號,
這種輸出方式會導致錯誤(有些數據分隔到了下一列)
寫入csv文件
,且能處理數據包含逗號的情況,可以考慮csv
包
這樣輸出的文件用excel打開後可以正確顯示
代碼如下:
#!/usr/bin/python3
import csv
def output_csv(datas):
"""
將爬取的數據導出到csv
:return:
"""
# categories , description,url
with open('test.csv', 'w') as csvfile:
file = csv.writer(csvfile)
# 寫入首行
file.writerow(['Sequence', 'Product Categories', 'Product SubCategories', 'Description', 'URL'])
for i in range(len(datas)):
key = datas[i]
sequence = i + 1
categories = key['categories']
subcategories = key['subcategories']
description = key['description']
url = key['url']
file.writerow([sequence, categories, subcategories, description, url])
# 構造測試數據列表,每條數據包含 類目,子類目,描述,url
categories_data = [{"categories": "test category A/B",
"subcategories": "",
"description": "Eco Foam Playing Puzzle, Mat in Geometry Shape 1",
"url": "https://www.baidu.com"},
{"categories": "test category A/B",
"subcategories": "",
"description": "Eco Foam Playing Puzzle Mat in Geometry Shape 2",
"url": "https://www.baidu.com"},
{"categories": "Eva Printing Mat",
"subcategories": "",
"description": '12"*12" New Design Triangle EVA Foam, Puzzle Interlocking Kids Mat',
"url": "https://www.baidu.com"
}]
output_csv(categories_data)
寫入Excel
寫入excel
可以使用python
的xlwt
包
excel裏寫入超鏈接
輸出超鏈接的格式爲:link = 'HYPERLINK("%s","%s")' % (url, [display word])
其中第一個參數是鏈接地址,第二個參數是顯示文字
xlwt
輸出超鏈接的代碼:sheet.write(row, col, xlwt.Formula(link))
不只是超鏈接可以這樣輸出,Excel公式也可以用這種方式輸出
輸出超鏈接的兩個問題
- sheet名不能包含特殊字符,注意對數據進行校驗
如果必須按某個字段分割sheet,可以考慮在首頁按此字段做鏈接,
每個sheet頁名稱用自增序列命名,
這樣,在首頁進行路由,跳轉到不同sheet頁面,
其它sheet頁面首行可增加一個返回鏈接 - 超鏈接中包含
"
時需要特殊處理查找了好多博客和論壇,有說Excel裏兩個雙引號代表一個雙引號,
也有說三個或四個代表一個雙引號,
經測試處理方法爲:str.replace('"', '""')
在Linux上好像不管幾個引號都不行,還沒找到問題所在
代碼如下:
import xlwt
def output_excel(datas):
wbk = xlwt.Workbook(encoding='utf-8')
for data in datas:
# 對 sheet 頁名稱數據需要校驗處理
sheet_name = data['category'].replace('/', '')
sheet = wbk.add_sheet(sheet_name)
# 寫入當前 sheet 頁表頭
sheet.write(0, 0, 'Sequence')
sheet.write(0, 1, 'Product SubCategories')
sheet.write(0, 2, 'Description')
row = 1 # 數據從第二行開始寫入
for product in data['products']:
sheet.write(row, 0, row) # 序列號,和行號相同
sheet.write(row, 1, product['subcategories'])
link = 'HYPERLINK("%s","%s")\n' % (product['url'], product['description'].replace('"', '""'))
sheet.write(row, 2, xlwt.Formula(link))
row += 1
wbk.save('test.xls')
# 構造測試數據,多個類目,每個類目有多種產品,每個產品有若干屬性
categories_data = {"category": "test category A/B",
"products": [{"subcategories": "",
"description": "Eco Foam Playing Puzzle Mat in Geometry Shape 1",
"url": "https://www.baidu.com"},
{"subcategories": "",
"description": "Eco Foam Playing Puzzle Mat in Geometry Shape 2",
"url": "https://www.baidu.com"}]
}, {
"category": "Eva Printing Mat",
"products": [{
"subcategories": "",
"description": '12"*12" New Design Triangle EVA Foam Puzzle Interlocking Kids Mat',
"url": "https://www.baidu.com"
}]
}
output_excel(categories_data)
UI界面顯示
這裏我使用了·python
的 tkinter
模塊,
遇到的問題主要有
1. 控件間交互
2. 多線程併發
3. 界面與代碼解耦
目前代碼都寫在一起,時間有限(只有週末),暫時先完成功能,
後面有時間再完善
tkinter實戰一段時間後再發博客
程序打包
程序打包使用 pyinstaller
運行命令如下:
# 下載
pip install pyinstaller
# 打包
cd <dir:程序所在目錄>
pyinstaller F -w -i=icon.ico Main.py
pyinstaller 命令參數說明
-F
表示生成單個可執行文件
-w
表示去掉控制檯窗口,這在GUI界面時非常有用。不過如果是命令行程序的話那就把這個選項刪除吧!
-p
表示你自己自定義需要加載的類路徑,一般情況下用不到
-i
表示可執行文件的圖標
pyinstaller 打包時的一些問題記錄
包含第三方庫的打包注意事項:
將第三方庫複製到程序同目錄中,再進行打包
無法定位程序輸入點ucrtbase.terminate於動態鏈接庫api-ms-win-crt-runtime-|1-1-0.dll 上。
給同學的程序報這個錯,網上搜到很多解決辦法,可參考以下鏈接:
https://blog.csdn.net/liweisnake/article/details/53055093
http://tieba.baidu.com/p/3848709732