1. 題目描述
中北大學(xué)信息安全技術(shù)爬蟲課程設(shè)計
題目 5:招投標(biāo)信息分析系統(tǒng) (20050441 2005031113)
要求:文檔內(nèi)容至少包含系統(tǒng)結(jié)構(gòu)、功能模塊圖、功能流程圖、數(shù)據(jù)流圖。實現(xiàn)語言不限。自動訪問http://www.ccgp.gov.cn/獲取信息
子題目 1:網(wǎng)絡(luò)爬蟲獲取招標(biāo)信息 要求:獲取數(shù)據(jù)數(shù)量大于 2 萬條,自定義多媒體格式(包括圖片、聲音、pdf 文件)保存在數(shù)據(jù)庫中。關(guān)鍵字用例可自定義。統(tǒng)計下載數(shù)據(jù),過濾數(shù)據(jù)。能顯示、查找數(shù)據(jù)信息。每 24 小時采集一次。
子題目 2:網(wǎng)絡(luò)爬蟲獲取中標(biāo)信息 要求:獲取數(shù)據(jù)數(shù)量大于 2 萬條,自定義多媒體格式(包括圖片、聲音、pdf 文件)保存在數(shù)據(jù)庫中。關(guān)鍵字用例可自定義。統(tǒng)計下載數(shù)據(jù),過濾數(shù)據(jù)。能顯示、查找數(shù)據(jù)信息。每 24 小時采集一次。
子題目 3:針對某一地區(qū)發(fā)出的招標(biāo)信息進行分析,對該地區(qū)可實現(xiàn)畫像,自動分析出該地區(qū)的招標(biāo)特點及經(jīng)濟發(fā)展水平
子題目 4:對獲取到的 pdf 文件進行解碼,數(shù)據(jù)保存入數(shù)據(jù)庫中,在數(shù)據(jù)庫中增刪改查??啥鄺l件查詢。
這份源代碼實現(xiàn)的是子題目 1 和子題目 3
2. 項目細(xì)節(jié)分析
此項目中的路徑均是絕對路徑,需要根據(jù)實際項目位置修改。 修改完路徑后點擊 autoSpider 即可運行
定時爬取任務(wù)思路
24小時爬取功能實現(xiàn)
使用Windows系統(tǒng)自帶的任務(wù)計劃程序來實現(xiàn)定時執(zhí)行Python程序的功能。具體操作步驟如下:
打開“任務(wù)計劃程序”,可以在Windows搜索欄中輸入“任務(wù)計劃程序”來打開。
在左側(cè)面板中找到“任務(wù)計劃程序庫”,右鍵點擊并選擇“創(chuàng)建任務(wù)”。
在彈出的對話框中,輸入任務(wù)名稱并勾選“使用最高權(quán)限運行”。
切換到“觸發(fā)器”選項卡,點擊“新建”,設(shè)置觸發(fā)器的具體時間和頻率,如每天、每周、每月等。
切換到“操作”選項卡,點擊“新建”,在“程序或腳本”一欄中輸入bat文件路徑
點擊“確定”保存設(shè)置,任務(wù)計劃程序會自動執(zhí)行Python程序,可以在“歷史記錄”中查看執(zhí)行情況。
避免多次爬取數(shù)據(jù)重復(fù)問題
為了避免爬取到重復(fù)信息,這里再項目中創(chuàng)建了log.txt文件用來記錄爬蟲爬取的最新狀態(tài),如果今日的爬蟲爬取到日志信息狀態(tài)時,說明已經(jīng)把最新的信息爬取完畢,直接退出爬蟲并且更新信息即可
所以可以分析出,這個項目如果這樣設(shè)計的話是不支持多線程的
網(wǎng)站結(jié)構(gòu)
公開招標(biāo)網(wǎng)站信息比較簡單,可以直接通過GET方法獲取。
我使用BS4進行解析,因為不同地方的招標(biāo)信息細(xì)節(jié)結(jié)構(gòu)可能不一樣,但是都是存在同一個div標(biāo)簽下
根據(jù)爬取信息確認(rèn)招標(biāo)地區(qū)
這里選擇優(yōu)先級不同的方式統(tǒng)計,掃描爬取到的信息,按照優(yōu)先級統(tǒng)計地區(qū)出現(xiàn)的次數(shù),最后根據(jù)次數(shù)最多的城市的省份劃分區(qū)域
這個項目使用了一個比較大的字典保存信息
3. 項目代碼
由于代碼比較多,這里只展示部分,完整項目Github上文章來源:http://www.zghlxwxcb.cn/news/detail-505643.html
from lxml import etree
from Spider.Seleium.msg_xpath import dialog
from Spider.Seleium.tool import unit_tool
from Spider.Seleium.tool import save
import openpyxl as op
# 多線程爬蟲
from queue import Queue
def setup():
# 打開保存文件
wb = op.load_workbook('C:\\Users\\30309\\Desktop\\GovSpider\\Spider\\Seleium\\data.xlsx')
# print(wb.get_named_ranges()) # 輸出工作頁索引范圍
# print(wb.get_sheet_names()) # 輸出所有工作頁的名稱
# 取第一張表
# ws = wb.get_sheet_names()
# table = wb.get_sheet_by_name(ws[0])
table = wb.active
# print(table.title) # 輸出表名
nrows = table.max_row # 獲得行數(shù)
ncol = table.max_column # 獲得行數(shù)
print(nrows, ncol)
# 讀取配置文件
head, endLine = save.readLog()
# 從配置文件中獲取是否添加頭部信息
have_head = False
if head.find('True') != -1:
have_head = True
dialog_flag = False
prevLine = []
end = False
# 爬取第1到第25頁數(shù)據(jù)
for page in range(1, 25):
root = f'http://www.ccgp.gov.cn/cggg/zygg/gkzb/index_{page}.htm'
html = etree.HTML(unit_tool.get_html(root))
paths = html.xpath(dialog.href)
for path in paths:
print(dialog.page_root + path)
page_msg = unit_tool.get_html(dialog.page_root + path)
list_bs4 = unit_tool.bs4Msg(page_msg)
if len(list_bs4) == 0:
continue
bs4 = list_bs4[0]
msg = unit_tool.bs4ToStr(bs4.select('td'))
have_file = unit_tool.haveFile(msg)
head, val = unit_tool.splitList(msg)
unit_tool.findCity(val)
if have_file:
file_id = unit_tool.getFile(bs4)
unit_tool.insertFile(file_id, val)
# print(file_id)
for sub_url in file_id:
file_url = dialog.download_root + sub_url
# print(file_url)
if not have_head:
# 所有文件寫入頭,頭只寫一次
save.InsertExcel(table, head, nrows)
nrows += 1
have_head = True
# 寫入數(shù)據(jù)
if endLine.find(str(val)) != -1:
end = True
break
if not dialog_flag:
prevLine = val
dialog_flag = True
save.InsertExcel(table, val, nrows)
nrows += 1
if end:
prevLine = ':'.join(endLine.split(':')[1:])
print("Dialog: 今日數(shù)據(jù)爬取完畢")
break
# print("DEBUG獲取完成")
# 寫入配置文件
save.writeLog(have_head, prevLine)
wb.save('data.xlsx')
4. 運行截圖
文章來源地址http://www.zghlxwxcb.cn/news/detail-505643.html
到了這里,關(guān)于中北大學(xué) - 信息對抗大三下學(xué)習(xí)課程設(shè)計(爬取招標(biāo)網(wǎng)站,進行招標(biāo)分析,數(shù)據(jù)保存execl中)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!