作為一個(gè)剛?cè)腴T對(duì)python極具喜愛的小白盯串,堅(jiān)信實(shí)踐才是掌握工具的唯一道路,所以一直想要用python來做一些項(xiàng)目來輔助提高工作宿饱、生活中的處理一些事情的效率陨溅。
在平時(shí)的工作中壹无,總是難免會(huì)需要搜集各種各樣的行業(yè)研究報(bào)告歼跟,單純從搜索引擎中搜尋下載又是一個(gè)耗費(fèi)時(shí)間和體力的事情。后來發(fā)現(xiàn)一個(gè)神奇良心的網(wǎng)站——數(shù)據(jù)局(http://shujuju.cn)格遭,里面時(shí)常更新一些報(bào)告解決燃眉之急哈街。
這么一個(gè)大寶藏,我決定將其報(bào)告名稱及鏈接爬取下來拒迅,因?yàn)橄螺d需要涉及到登陸骚秦,而登陸遇到了比較棘手的圖片驗(yàn)證的問題,后期將會(huì)針對(duì)報(bào)告本身的進(jìn)行一些分析(下期見~)
其實(shí)整體思路是相當(dāng)?shù)暮?jiǎn)單璧微, 因?yàn)榫W(wǎng)站本身就沒有太多復(fù)雜的地方作箍,思路如下:
- 用requests庫(kù)爬取報(bào)告列表頁(yè)第一頁(yè),并通過lxml的etree進(jìn)行頁(yè)面分析獲取到整體的頁(yè)數(shù)
- 因?yàn)榉?yè)邏輯只是在 "http://www.shujuju.cn/lecture/detail/"后加上頁(yè)碼數(shù)字前硫,故利用規(guī)律構(gòu)建所有需要爬取的網(wǎng)頁(yè)鏈接
- 然后繼續(xù)使用requests和xlml將所有列表頁(yè)中報(bào)告名稱和報(bào)告所在的頁(yè)面鏈接給保留下來
- 然后逐一去爬取報(bào)告詳情頁(yè)胞得,文末附錄的報(bào)告鏈接給抓取保存
- 最后用csv將所有數(shù)據(jù)保存在本地
完整代碼如下:
#-*- coding: utf-8 -*
import requests
import re
import time
import csv
from lxml import etree
#構(gòu)建header
headers = {
"Accept": "application/json",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
}
#獲得目前最新的報(bào)告的編號(hào)
url = "http://www.shujuju.cn/lecture/browe"
response = requests.get(url,headers = headers)
datas = etree.HTML(response.text)
print(datas.text)
results = datas.xpath('//div[@class="textdescription-small-info"]/h3/a/@href')
last_report_num = re.search('\d{4}',results[0])
last_report_num = last_report_num[0]
#構(gòu)建報(bào)告的列表
report_page_urls = []
for report_num in range(int(last_report_num)):
report_page_url = "http://www.shujuju.cn/lecture/detail/"+str(report_num+1)
report_page_urls.append(report_page_url)
###獲取報(bào)告頁(yè)內(nèi)容
report_info = []
for i in range(int(last_report_num)):
target_url=report_page_urls[i]
response = requests.get(target_url,headers = headers)
page_datas = etree.HTML(response.text)
#獲取標(biāo)題
title = page_datas.xpath('//h1[@class="title"]/text()')
title = title[0]
#獲取下載鏈接
report_download_ul = page_datas.xpath('//div[@class="report-article"]/ul/li/a/@href')
try:
report_download_ul=report_download_ul[0]
report_download_ul = "http://www.shujuju.cn"+report_download_ul
except IndexError:
print(title + " 報(bào)告頁(yè)面沒有附下載鏈接")
report_download_ul = ''
new_report_info = { 'report_title':title,'download_url':report_download_ul,'paga_url':target_url}
report_info.append(new_report_info)
print("已處理第"+str(i+1)+'個(gè)頁(yè)面,共'+last_report_num+'個(gè)頁(yè)面')
time.sleep(1)
# 保存數(shù)據(jù)到csv文件中
with open('E:/report/report.csv','w') as csvfile:
fieldnames = report_info[1].keys()
f_csv = csv.DictWriter(csvfile,fieldnames = fieldnames)
f_csv.writeheader()
for data in report_info:
try:
f_csv.writerow(data)
except UnicodeEncodeError:
print('第'+str(data)+'個(gè)報(bào)告的標(biāo)題存在特殊字符,保存失敗')
print("保存文件成功屹电,處理結(jié)束")
因?yàn)橹型居袃蓚€(gè)問題阶剑,一個(gè)是網(wǎng)頁(yè)中可能介紹了報(bào)告卻沒有附上報(bào)告鏈接跃巡,這種情況下報(bào)告名稱和網(wǎng)頁(yè)鏈接保留下來了,是沒有下載鏈接牧愁;另一個(gè)問題是由于報(bào)告標(biāo)題中存在一些特殊字符素邪,這些字符沒法寫入到CSV中,故暫時(shí)先沒有記錄猪半;
最后的保存下來的結(jié)果如下:
接下來需要對(duì)這些保存下來的資產(chǎn)進(jìn)行分析利用兔朦,目前正在思考嘗試中,如果覺得有有意思的地方磨确,下次將會(huì)繼續(xù)分享~