Python 網(wǎng)頁爬蟲
一、要解決的問題
需要解決的是根據(jù)自定義的關(guān)鍵詞自動搜索google學(xué)術(shù),解析搜索到的網(wǎng)頁,下載所有相應(yīng)的論文的PDF鏈接。這里我們采用Python來實現(xiàn),
二、Python入門
python 自動縮進(jìn):shift+table整塊向左縮進(jìn),table向右縮進(jìn),在修改整塊代碼時很有用比如將函數(shù)變成單獨執(zhí)行時。
了解python的變量,包,函數(shù)定義等
三、網(wǎng)頁知識
3.1 瀏覽網(wǎng)頁的過程
打開網(wǎng)頁的過程其實就是瀏覽器作為一個瀏覽的“客戶端”,向服務(wù)器端發(fā)送了 一次請求,把服務(wù)器端的文件“抓”到本地,再進(jìn)行解釋、展現(xiàn)。
HTML是一種標(biāo)記語言,用標(biāo)簽標(biāo)記內(nèi)容并加以解析和區(qū)分。
瀏覽器的功能是將獲取到的HTML代碼進(jìn)行解析,然后將原始的代碼轉(zhuǎn)變成我們直接看到的網(wǎng)站頁面。
3.2 URI和URL的概念
簡單的來講,URL就是在瀏覽器端輸入的 http://www.baidu.com 這個字符串。
在理解URL之前,首先要理解URI的概念。
URL是URI的一個子集。它是Uniform Resource Locator的縮寫,譯為“統(tǒng)一資源定位 符”。
通俗地說,URL是Internet上描述信息資源的字符串,主要用在各種WWW客戶程序和服務(wù)器程序上。
采用URL可以用一種統(tǒng)一的格式來描述各種信息資源,包括文件、服務(wù)器的地址和目錄等。
URL的一般格式為(帶方括號[]的為可選項):
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
URL的格式由三部分組成:
①第一部分是協(xié)議(或稱為服務(wù)方式)。
②第二部分是存有該資源的主機IP地址(有時也包括端口號)。
③第三部分是主機資源的具體地址,如目錄和文件名等。
第一部分和第二部分用“://”符號隔開,
第二部分和第三部分用“/”符號隔開。
第一部分和第二部分是不可缺少的,第三部分有時可以省略。
參考至:http://blog.csdn.net/pleasecallmewhy/article/details/8922826
四、網(wǎng)頁爬蟲
4.1 解決google無法登陸
因為要抓取的google學(xué)術(shù)的頁面,但是google在中國屏蔽了,所以需要在電腦上先配置好goagent,然后進(jìn)行代理配置,代碼如下
proxy = urllib2.ProxyHandler({"http":"http://127.0.0.1:8087","https":"https://127.0.0.1:8087"})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
4.2 解決抓取屏蔽
對于少量的查詢,但如果要進(jìn)行上千上萬次的查詢,上面的方法就不再有效了, Google會檢測你請求的來源,如果我們利用機器頻繁爬取Google的搜索結(jié)果,不多久就Google會block你的IP,并給你返回503 Error頁面。可以設(shè)置URL請求的headers, 偽裝我們的user agent。簡單的說,user agent就是客戶端瀏覽器等應(yīng)用程序使用的一種特殊的網(wǎng)絡(luò)協(xié)議, 在每次瀏覽器(郵件客戶端/搜索引擎蜘蛛)進(jìn)行 HTTP 請求時發(fā)送到服務(wù)器,服務(wù)器就知道了用戶是使用什么瀏覽器(郵件客戶端/搜索引擎蜘蛛)來訪問的。 有時候為了達(dá)到一些目的,我們不得不去善意的欺騙服務(wù)器告訴它我不是在用機器訪問你。
user_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0', \
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0', \
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533+ \
(KHTML, like Gecko) Element Browser 5.0', \
'IBM WebExplorer /v0.94', 'Galaxy/1.0 [en] (Mac OS X 10.5.6; U; en)', \
'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)', \
'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14', \
'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) \
Version/6.0 Mobile/10A5355d Safari/8536.25', \
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/28.0.1468.0 Safari/537.36', \
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; TheWorld)']
proxy = urllib2.ProxyHandler({"http":"http://127.0.0.1:8087","https":"https://127.0.0.1:8087"})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
4.3 正則表達(dá)式解析網(wǎng)頁
使用單個字符串來描述、匹配一系列符合某個句法規(guī)則的字符串。比如:現(xiàn)在的需求是要找到一個正則表達(dá)式來匹配后綴是“.pdf”的字符串。
inputURL = 'http://scholar.google.com/scholar?q=text+detection&btnG=&hl=en&as_sdt=0%2C5'
request = urllib2.Request(inputURL)
index = random.randint(0, 9)
user_agent = user_agents[index]
request.add_header('User-agent', user_agent)
f = urllib2.urlopen(request).read() #打開網(wǎng)頁
print f
localDir = 'E:\download\\' #下載PDF文件需要存儲在本地的文件夾
urlList = [] #用來存儲提取的PDF下載的url的列表
for eachLine in f: #遍歷網(wǎng)頁的每一行
line = eachLine.strip() #去除行首位的空格,習(xí)慣性寫法
if re.match('.*PDF.*', line): #去匹配含有“PDF”字符串的行,只有這些行才有PDF下載地址
wordList = line.split('\"') #以"為分界,將該行分開,這樣就將url地址單獨分開了
for word in wordList: #遍歷每個字符串
if re.match('.*\.pdf$', word): #去匹配含有“.pdf”的字符串,只有url中才有
urlList.append(word) #將提取的url存入列表
for everyURL in urlList: #遍歷列表的每一項,即每一個PDF的url
wordItems = everyURL.split('/') #將url以/為界進(jìn)行劃分,為了提取該PDF文件名
for item in wordItems: #遍歷每個字符串
if re.match('.*\.pdf$', item): #查找PDF的文件名
PDFName = item #查找到PDF文件名
localPDF = localDir + PDFName #將本地存儲目錄和需要提取的PDF文件名進(jìn)行連接
try:
urllib.urlretrieve(everyURL, localPDF) #按照url進(jìn)行下載,并以其文件名存儲到本地目錄
except Exception, e:
continue
五、遇到的問題及解決
5.1 采用http協(xié)議
打開google的時候,如果用https協(xié)議無法打開網(wǎng)頁取到內(nèi)容,只有采用http協(xié)議才可以,原因可能是https采用加密協(xié)議。
# -*- coding: utf-8 -*-
"""
Created on Fri Feb 13 16:27:02 2015
@author: dwanminghuang
"""
import urllib #導(dǎo)入urllib模塊
import urllib2 #導(dǎo)入urllib2模塊
import re
import re, random, types #導(dǎo)入正則表達(dá)式模塊:re模塊
user_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0', \
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0', \
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533+ \
(KHTML, like Gecko) Element Browser 5.0', \
'IBM WebExplorer /v0.94', 'Galaxy/1.0 [en] (Mac OS X 10.5.6; U; en)', \
'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)', \
'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14', \
'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) \
Version/6.0 Mobile/10A5355d Safari/8536.25', \
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/28.0.1468.0 Safari/537.36', \
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; TheWorld)']
proxy = urllib2.ProxyHandler({"http":"http://127.0.0.1:8087","https":"https://127.0.0.1:8087"})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
inputURL = 'http://scholar.google.com/scholar?q=text+detection&btnG=&hl=en&as_sdt=0%2C5'
request = urllib2.Request(inputURL)
index = random.randint(0, 9)
user_agent = user_agents[index]
request.add_header('User-agent', user_agent)
f = urllib2.urlopen(request).read() #打開網(wǎng)頁
print f
localDir = 'E:\download\\' #下載PDF文件需要存儲在本地的文件夾
urlList = [] #用來存儲提取的PDF下載的url的列表
for eachLine in f: #遍歷網(wǎng)頁的每一行
line = eachLine.strip() #去除行首位的空格,習(xí)慣性寫法
if re.match('.*PDF.*', line): #去匹配含有“PDF”字符串的行,只有這些行才有PDF下載地址
wordList = line.split('\"') #以"為分界,將該行分開,這樣就將url地址單獨分開了
for word in wordList: #遍歷每個字符串
if re.match('.*\.pdf$', word): #去匹配含有“.pdf”的字符串,只有url中才有
urlList.append(word) #將提取的url存入列表
for everyURL in urlList: #遍歷列表的每一項,即每一個PDF的url
wordItems = everyURL.split('/') #將url以/為界進(jìn)行劃分,為了提取該PDF文件名
for item in wordItems: #遍歷每個字符串
if re.match('.*\.pdf$', item): #查找PDF的文件名
PDFName = item #查找到PDF文件名
localPDF = localDir + PDFName #將本地存儲目錄和需要提取的PDF文件名進(jìn)行連接
try:
urllib.urlretrieve(everyURL, localPDF) #按照url進(jìn)行下載,并以其文件名存儲到本地目錄
except Exception, e:
continue

浙公網(wǎng)安備 33010602011771號