Python學習日記12|用python3多進程批量下載pdf文件

今天是2016年6月9日访惜,也是農(nóng)歷的端午節(jié)。

難得的小長假萍虽,轉(zhuǎn)眼就到學期末,忙了一學期大概大家或回家過端午或在宿舍休息調(diào)養(yǎng)吧形真,8點25到實驗室的時候只有一個從廣西大學來學院進修的教授已經(jīng)開始了一天的工作杉编。自己是覺得沒什么特別,所有的節(jié)日能讓人開心就好咆霜,即使沒有粽子吃邓馒。

Anyway, 還是想說一聲:端午節(jié)快樂~~


最近實習還一直沒有著落蛾坯,周一的面試是已經(jīng)gg了光酣,然后又開始投簡歷以求暑假有個去處,而不至于落單無事可做脉课,盡管自己口頭上一直說著無所謂救军。

這次的任務是下載上海清算網(wǎng)( http://www.shclearing.com/xxpl/fxpl/ )上前五頁中的pdf附件。自己大約琢磨了兩天才搞定倘零,最開始以為可以像下載常規(guī)的pdf文件文件一樣缤言,直接獲得pdf文件的鏈接地址然后用retrieve函數(shù)即可完成,但是發(fā)現(xiàn)pdf文件的路徑是有javascript腳本控制的视事,你根本拿不到文件的鏈接地址胆萧。

于是開始看能不能構(gòu)造路徑,發(fā)現(xiàn)還是行不通俐东,再用fiddler去監(jiān)控點擊下載時發(fā)生了什么跌穗,這時才有了一點眉目:在點擊pdf下載時,是有提交post請求的虏辫,傳入的了兩個參數(shù)分別是filename和descname蚌吸。這時才恍然大悟,像這種點擊下載的文件砌庄,你要模擬這個點擊行為羹唠,一般應該就是一個post請求。

再說一下知道是提交post請求后實際操作時有幾點要注意:
1.提交到post請求中的參數(shù)娄昆,通過查看源碼后發(fā)現(xiàn)是可以用BesutifulSoup配合正則表達式從源碼中來直接提取的佩微,正則表達式一般就用re.search(),或者re.findall()

2.提交的filename和descname參數(shù)必須先轉(zhuǎn)成URL編碼萌焰,這是通過fiddler截取到的form表單中發(fā)現(xiàn)的哺眯,所以又引入urllib庫中的parse,再使用parse.quote(text)函數(shù)來實現(xiàn)將兩個參數(shù)轉(zhuǎn)化為URL編碼扒俯。(自己操作時quote()函數(shù)的用法是采用的python3中的語法奶卓,若是在python2.x版本中則是直接用urllib.quote(text)即可一疯,但是,但是python2.x版本關(guān)于中文編碼真的有很多問題夺姑,動不動就報錯墩邀,所以果斷沒有用python2.x版本

3.在上述基礎(chǔ)上提交了filename和descname參數(shù),如何將pdf保存下來盏浙,由于pdf文件比較大磕蒲,有的達到10M,因此這里會用到 Response.iter_content()的使用只盹,有固定的用法辣往,實現(xiàn)的功能是以流的形式保存較大的文件。具體可以參考殖卑。
( http://stackoverflow.com/questions/16694907/how-to-download-large-file-in-python-with-requests-py )

4.要再說一點的就是有時候用requests.get()去請求網(wǎng)址時站削,加上headers雖說是為了偽裝成瀏覽器進行訪問,但有時反而會沒有反應孵稽,去掉headers后反而就直接出了結(jié)果许起,這是自己不解的地方。

最后貼上代碼和抓取結(jié)果(243個pdf文件菩鲜,最大有24M)园细,如下:


#!/usr/bin/env python
# _*_ coding: utf-8 _*_

import requests
from bs4 import BeautifulSoup
from urllib import parse
import re
import time
from multiprocessing import Pool

headers={
    'Host': 'www.shclearing.com',
    'Connection': 'keep-alive',
    'Content-Length': '478',
    'Cache-Control': 'max-age=0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Origin': 'http://www.shclearing.com',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.8',
    'Cookie': '_ga=GA1.2.1076225437.1465265795; JSESSIONID=24XcXXCb1bkkKWnKn1LLNBqGTR8qnfmcmf3p5T2pw2TwpNCytnfp!301927905; HDSESSIONID=fhwLXXLPrBqXwsvCyqKL1lCbp5QmGDxxGJ4wd8vrfhr2ksgJcpvf!1660475047; Hm_lvt_d885bd65f967ea9372fc7200bc83fa81=1465223724; Hm_lpvt_d885bd65f967ea9372fc7200bc83fa81=1465354426'
   }

url1='http://www.shclearing.com/xxpl/fxpl/index.html'
url2=['http://www.shclearing.com/xxpl/fxpl/index_{}.html'.format(str(i)) for i in range(1,5,1)]
url2.insert(0,url1)

links=[]
host='http://www.shclearing.com/xxpl/fxpl/'
def get_link_list(url):
    for item in url:
        web_data=requests.get(item)
        soup=BeautifulSoup(web_data.text,'lxml')
        list=soup.select('ul.list li a')
        for item in list:
            link=host+item.get('href').split('./')[1]
            links.append(link)



FileName=[]
DownName=[]
DownName1=[]   #DownName1用于存放轉(zhuǎn)碼后的名稱
def get_contents(link):
    web_data=requests.get(link)
    soup=BeautifulSoup(web_data.text,'lxml')
    contents=soup.select('#content > div.attachments > script')[0].get_text()
    a=str(re.findall(r"fileNames = '(.*?)'",contents,re.M)[0])
    b=str(re.findall(r"descNames = '(.*?)'",contents,re.M)[0])
    FileName=a.replace('./','').split(';;')
    DownName=b.split(';;')    #先用正則表達式提取出后面post中要用到的兩個參數(shù),但是要將中文轉(zhuǎn)化為對應的URL編碼
    for item in DownName:
        a=parse.quote(item)
        DownName1.append(a)
    print(FileName,'\\n',DownName,'\\n',DownName1)

    for i,j,k in zip(FileName,DownName1,DownName):
        download_file(i,j,k)

# link='http://www.shclearing.com/xxpl/fxpl/cp/201606/t20160608_159680.html'
# get_contents(link)
# print('The pdf have been downloaded successfully !')


def download_file(a,b,c):
    data={
    'FileName':a,
    'DownName':b }

    local_filename = c
    post_url='http://www.shclearing.com/wcm/shch/pages/client/download/download.jsp'
    time.sleep(0.5)  #限制下載的頻次速度接校,以免被封
    # NOTE the stream=True parameter
    r = requests.post(post_url, data=data, headers=headers, stream=True)
    with open(local_filename, 'wb') as f:
      for chunk in r.iter_content(chunk_size=1024):  # 1024 是一個比較隨意的數(shù)猛频,表示分幾個片段傳輸數(shù)據(jù)。
          if chunk: # filter out keep-alive new chunks
              f.write(chunk)
              f.flush() #刷新也很重要蛛勉,實時保證一點點的寫入鹿寻。
    return local_filename



if __name__=='__main__':
    get_link_list(url2)
    pool=Pool()
    pool.map(get_contents,links)
    print('The documents have been downloaded successfully !')

如果要將下載下來的文檔的保存的路徑存入mysql中,需要再加上下面的語句:
#conn=pymysql.connect(host='localhost',user='root',passwd='root',db='mysql',charset='utf8')
#cursor = conn.cursor()
#cursor.execute('CREATE TABLE root (id int auto_increment primary key,content varchar(100))')
以及在download_file(a,b,c)函數(shù)中的return local_filename語句前加上:
cursor.execute('insert into root(content) values (%s)',local_filename)

抓取結(jié)果截圖.PNG
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诽凌,一起剝皮案震驚了整個濱河市毡熏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侣诵,老刑警劉巖痢法,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杜顺,居然都是意外死亡财搁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門哑舒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妇拯,“玉大人幻馁,你說我怎么就攤上這事洗鸵≡叫猓” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵膘滨,是天一觀的道長甘凭。 經(jīng)常有香客問我,道長火邓,這世上最難降的妖魔是什么丹弱? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮铲咨,結(jié)果婚禮上躲胳,老公的妹妹穿的比我還像新娘。我一直安慰自己纤勒,他們只是感情好坯苹,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著摇天,像睡著了一般粹湃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泉坐,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天为鳄,我揣著相機與錄音,去河邊找鬼腕让。 笑死孤钦,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的纯丸。 我是一名探鬼主播司训,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼液南!你這毒婦竟也來了壳猜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤滑凉,失蹤者是張志新(化名)和其女友劉穎统扳,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畅姊,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡咒钟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了若未。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朱嘴。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出萍嬉,到底是詐尸還是另有隱情乌昔,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布壤追,位于F島的核電站磕道,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏行冰。R本人自食惡果不足惜溺蕉,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望悼做。 院中可真熱鬧疯特,春花似錦、人聲如沸肛走。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽羹与。三九已至故硅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纵搁,已是汗流浹背吃衅。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留腾誉,地道東北人徘层。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像利职,于是被迫代替她去往敵國和親趣效。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容