用python(Requests庫)爬取數(shù)據(jù)局行業(yè)報(bào)告的信息

作為一個(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ù)暮唵危?因?yàn)榫W(wǎng)站本身就沒有太多復(fù)雜的地方,思路如下:

  1. 用requests庫爬取報(bào)告列表頁第一頁,并通過lxml的etree進(jìn)行頁面分析獲取到整體的頁數(shù)
  2. 因?yàn)榉撨壿嬛皇窃?"http://www.shujuju.cn/lecture/detail/"后加上頁碼數(shù)字,故利用規(guī)律構(gòu)建所有需要爬取的網(wǎng)頁鏈接
  3. 然后繼續(xù)使用requests和xlml將所有列表頁中報(bào)告名稱和報(bào)告所在的頁面鏈接給保留下來
  4. 然后逐一去爬取報(bào)告詳情頁,文末附錄的報(bào)告鏈接給抓取保存
  5. 最后用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)告頁內(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)告頁面沒有附下載鏈接")
        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è)頁面,共'+last_report_num+'個(gè)頁面')
    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)頁中可能介紹了報(bào)告卻沒有附上報(bào)告鏈接,這種情況下報(bào)告名稱和網(wǎng)頁鏈接保留下來了,是沒有下載鏈接;另一個(gè)問題是由于報(bào)告標(biāo)題中存在一些特殊字符,這些字符沒法寫入到CSV中,故暫時(shí)先沒有記錄;

最后的保存下來的結(jié)果如下:

報(bào)告保存結(jié)果列表.png

接下來需要對(duì)這些保存下來的資產(chǎn)進(jìn)行分析利用,目前正在思考嘗試中,如果覺得有有意思的地方,下次將會(huì)繼續(xù)分享~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容