|本文為博主原創,轉載請說明出處
任務需求:要求通過Google針對任意關鍵字爬取大量PDF文檔,如K-means,KNN,SVM等。
環境:Anaconda3——Windows7-64位——Python3.6——lantern——迅雷極速版——360瀏覽器
解決思路:現在有一個需要下載大量特定主題的PDF文檔以為特定工作提供數據支撐的任務,初步是想利用Google強大的搜索功能進行特定主題的搜索,指定文件類型filetype:pdf,如果你要指定site的話,如.edu、.org等,可以在特定的機構或學校的網站上搜索文檔。比如我要下載大量svm的pdf文檔,我在Google搜索欄中輸入svm filetype:pdf之后分析每一頁的地址,發現地址之間存在類似之處,這就為寫代碼批量下載PDF文檔提供了便利。這是一個很通用的通過Google下載大量特定主題特定文檔的爬蟲,有很多用途,讀者可以自己去挖掘噢!比如博主就用這個簡單的爬蟲正在完成導師交代的任務,當然這只是其中很小一步,但是總得一步一步往前走嘛!
先貼代碼,下面再對特定行進行解釋
1 # -*- coding: utf-8 -*-
2 import urllib.request 3 import re#導入正則表達式包
4 import time 5
6 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
7 url_part_1="https://www.google.co.jp/search?q=svm+filetype:pdf&lr=&hl=zh-CN&as_qdr=all&ei=VIdnWZ3SGIS18QXW3aAg&start="
8 url_part_2="&sa=N&biw=1745&bih=810"
9 Page_number=28 #每一個特定主題搜索結果的頁數,這個針對不同的主題結果會不一樣
10 #這幾行代碼針對不同的主題要進行相應的修改,稍后再解釋url_part_1和url_part_2的意思
11 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
12
13 timeout=20 #設置網站的訪問超時時間為20秒
14 sleep_download_time=5 #爬一個網頁休息5秒鍾,不能訪問的太頻繁
15 url_list_total=[]#將所有pdf文檔的鏈接地址放在這個列表當中
16 user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36'
17 #這個是我的360瀏覽器的user_agent,按F12可查
18
19 for i in range(0,Page_number): 20 url_page=url_part_1+str(i*10)+url_part_2#拼接成每個Google搜索結果的頁面地址,每個頁面包含10個鏈接,故乘以10 21 headers = { 'User-Agent' : user_agent,'Referer':url_page} 22 request= urllib.request.Request(url_page,headers=headers) 23 try:#可能會出現異常[WinError 10054] 24 page = urllib.request.urlopen(request,timeout=timeout) 25 except urllib.error.URLError as e: 26 print(e.reason) 27
28 html= page.read().decode('utf-8')#必須要有.decode('utf-8')以用來轉碼,從byte轉為utf-8 29 pattern = re.compile('<h3 class="r".*?<a href="(.*?)" onmousedown')#通過compile方法編譯生成一個匹配模式pattern對象,然后利用這個對象來進行進一步的匹配。 30 url_list=re.findall(pattern,html)#搜索html,以列表形式返回全部能匹配的子串這個表達式主要是為了獲取本頁面的PDF鏈接地址 31
32 for line in url_list[:]: 33 url_list_total.append(line) 34 url_list=[] 35 print(page.getcode()) 36 print(i) 37 page.close() 38 html=[] 39 time.sleep(sleep_download_time)#隔幾秒再運行 40
41 f=open('url_list_total.txt','w') 42 for url in url_list_total: 43 f.write(url) 44 f.write('\n') 45 f.close()
注釋:
7-8行:通過Google搜索的結果地址是有規律的,如通過關鍵字svm filetype:pdf返回的結果的第一頁地址如下
https://www.google.co.jp/search?q=svm+filetype:pdf&lr=&hl=zh-CN&as_qdr=all&ei=VIdnWZ3SGIS18QXW3aAg&start=10&sa=N&biw=1745&bih=810
做如下拆分
"https://www.google.co.jp/search?q=svm+filetype:pdf&lr=&hl=zh-CN&as_qdr=all&ei=VIdnWZ3SGIS18QXW3aAg&start=" + 10 + "&sa=N&biw=1745&bih=810"
分成三部分,方便后面進行迭代。
21行:用來包裝頭部的數據:
——User-Agent:頭部可以攜帶瀏覽器名和版本號、操作系統名和版本號、默認語言信息;
——Referer:用來防止盜鏈
——Connection:表示連接狀態,記錄Session狀態
##以上就完成了所有pdf鏈接的下載
------------------------------------------------------------------------------------------------------分割線---------------------------------------------------------------------------------------------------------------
下面就進行pdf的主動下載,代碼如下:
1 def getFile(url): 2 file_name = url.split('/')[-1] 3 u = urllib.request.urlopen(url) 4 f = open(file_name, 'wb') 5 block_sz = 8192
6 while True: 7 buffer = u.read(block_sz) 8 if not buffer: 9 break
10 f.write(buffer) 11 f.close() 12 print("Sucessful to svm" + " " + file_name) 13
14 os.mkdir('svm') 15 os.chdir(os.path.join(os.getcwd(), 'svm')) 16 for url in url_list_total[:]: 17 getFile(url)
我在下載的時候並沒有用以上的代碼,而是直接通過迅雷極速版下載的,應該會快一些,當然了,用代碼下載能省一些事兒!
歡迎批評指正!