抓取某安全公司升級包鏈接(python小白登天日記)

如果有大神路過变勇,希望指出我描述種錯誤的部分禀苦,感激不盡。
他的工作是去別人公司給安全軟件升級遭铺,比如如果客戶公司版本號是1.1丽柿,最新版本號是10.0,他需要從1.2下載到10.0并且按順序安裝魂挂,這是他給我的鏈接:
<code>http://update.nsfocus.com/update/listAurora/v/5</code>
可以看到需要下載的東西確實挺多的甫题,如果一個個點不是不能點完,但是這個正好可以用來練手涂召,也挺簡單的坠非,不需要登錄,

這一次我先上代碼 版本2.7:

<blockquote>
from bs4 import BeautifulSoup#解析網(wǎng)頁的模塊
import re#正則模塊
import urllib#網(wǎng)絡請求模塊
url = "http://update.nsfocus.com/update/listAurora/v/5"
page = urllib.urlopen(url)#請求頁面
html = page.read()#獲取頁面內(nèi)容
soup = BeautifulSoup(html,'html.parser')#將頁面變成bs的一個對象芹扭,用來后面的解析
test = soup.find_all(attrs={'href':re.compile("/update/downloads/id/")})#利用正則找到 含有href這個屬性麻顶,且href中包含"/update/downloads/id/"這塊字符串的所有標簽。
for a in test:#遍歷下載鏈接
Furl = downloadUrl + a['href']
print Furl
urllib.urlretrieve(Furl,"code.zip")#開始下載舱卡,但是這一塊是錯誤的
</blockquote>

先說BeautifulSoup辅肾,以下簡稱bs:

bs是用來解析接收到的網(wǎng)頁的,解析約等于處理數(shù)據(jù)轮锥,咱們接受下來的網(wǎng)頁有數(shù)不清的嵌套的標簽矫钓,標簽里有一堆亂七八糟的屬性和值還有標簽自己的content,我打印一下上面代碼中的html大家一起鑒賞一下:
<blockquote>
<header class="header in-header">
<div class="n fixed">
<div class="language">
<div class="tools" id="tool">
<ul>
<li class="ui" style="z-index: 1000;">
<a id="language" class="ui2012" href="javascript:void(0)">語言</a>
<ul id="language_list" style="display:none;">
<li
fc8

<a target="_blank" >中文</a></li>
<li><a target="_blank" >ENGLISH</a></li>
<li><a target="_blank" >日本語</a></li>
</ul>
</li>
<li><a class="en">如何購買</a></li>
</ul>
</div>
</div>
<div class="topbox">
<div class="logo">

<a >
</a>
</div>
<div class="in_share bshare-custom">
<span class="phone">400-818-6868</span>
</div>
<ul class="nav fixed in-nav">
<li class="sy"><a class="shouye" >首頁</a><div class="line sy"></div></li>
<li class="sy"><a >解決方案</a><div class="line"></div>
<dl>
<dd>
</blockquote>

本來想將這個html所有代碼都拿過來大家鑒賞一下但是復制了一下,實在太大了新娜,而且簡書都給我提示了:

簡書提示

上面放的代碼只是極小極小一部分赵辕,這也是我們?yōu)槭裁匆胋s模塊來解析網(wǎng)頁的原因,他會讓我們解析這個網(wǎng)頁的過程變得異常簡單且流暢概龄,下面說一下常用的方法:
<blockquote>soup = BeautifulSoup(html,'html.parser')</blockquote>
將html這個頁面解析為一個bs的可操作對象还惠。
BeautifulSoup()這個方法必填的兩個參數(shù),一個是html私杜,也就是我們需要解析的網(wǎng)頁蚕键,另一個是一個str,它代表的是什么呢衰粹?<a >Beautiful Soup 4.4.0 文檔</a>查看官方文檔锣光,發(fā)現(xiàn)它有詳細的解釋:

解析器 使用方法 優(yōu)勢 劣勢
Python標準庫 <code>BeautifulSoup(markup, "html.parser") </code> <p>Python的內(nèi)置標準庫</p><p>執(zhí)行速度適中</p><p>文檔容錯能力強</p> Python 2.7.3 or 3.2.2)前 的版本中文檔容錯能力差
Python標準庫 <code>BeautifulSoup(markup, "lxml") </p>速度快<p>文檔容錯能力強 需要安裝C語言庫
lxml XML 解析器 <p><code>BeautifulSoup(markup, ["lxml-xml"])<p><code>BeautifulSoup(markup, "xml") <p>速度快<p>唯一支持XML的解析器 需要安裝C語言庫
html5lib <code>BeautifulSoup(markup, "html5lib") <p>最好的容錯性<p>以瀏覽器的方式解析文檔<p>生成HTML5格式的文檔 <p>速度慢<p>不依賴外部擴展

上面的表格詳細的寫明白了這個字符串對應各種狀況下應該填什么,優(yōu)劣點都寫的很清楚铝耻,我就不贅述了誊爹。

find_all方法簡析:

<code>test = soup.find_all(attrs={'href':re.compile("/update/downloads/id/")})</code>
因為我要抓取當前頁面的所有下載鏈接,所以我首先要找到含有這些鏈接的所有的網(wǎng)頁標簽瓢捉,chrome打開鏈接频丘,我用Mac的快捷鍵option+command+i 打開頁面,然后shift+command+c 選中左邊的顯示內(nèi)容泊柬,右邊網(wǎng)頁元素部分就會高亮對應的標簽:

審查網(wǎng)頁元素

可以看到右邊代碼高亮的部分如下:
<code><a href="/update/downloads/id/18501">aurora-051701.dat</a></code>
下一個下載鏈接所在的標簽:
<code><a href="/update/downloads/id/18486">aurora-051700.dat</a></code>

看了幾個標簽之后總結(jié)一下規(guī)律椎镣,發(fā)現(xiàn)href中都含有"/update/downloads/id"這個字符串,但是這個字符串并不是完整的href值兽赁,所以我們用re.compile("/update/downloads/id")來表示完整的值状答。
接著說回來<a >find_all()</a>:
<code>find_all(name,attrs,recursive,string,**kwargs)</code>

<a>
<blockquote>

name 參數(shù)

name參數(shù)可以查找所有名字為 name的tag,字符串對象會被自動忽略掉.簡單的用法如下:
<code>soup.find_all("title")# [<title>The Dormouse's story</title>]</code>
重申: 搜索 name參數(shù)的值可以使任一類型的 過濾器 ,字符c,正則表達式,列表,方法或是 <code>True.</code>

keyword 參數(shù)

如果一個指定名字的參數(shù)不是搜索內(nèi)置的參數(shù)名,搜索時會把該參數(shù)當作指定名字tag的屬性來搜索,如果包含一個名字為 id的參數(shù),BeautifulSoup會搜索每個tag的”id”屬性.
<code>soup.find_all(id='link2')# [<a class="sister" id="link2">Lacie</a>]</code>

如果傳入 href 參數(shù),Beautiful Soup會搜索每個tag的”href”屬性:
<code>soup.find_all(href=re.compile("elsie"))# [<a class="sister" id="link1">Elsie</a>]</code>

搜索指定名字的屬性時可以使用的參數(shù)值包括 字符串 , 正則表達式 , 列表, True .
下面的例子在文檔樹中查找所有包含 id 屬性的tag,無論 id 的值是什么:
<code>
soup.find_all(id=True)
[//<a class="sister" id="link1">Elsie</a>,
//<a class="sister" id="link2">Lacie</a>,
//<a class="sister" id="link3">Tillie</a>]</code>

使用多個指定名字的參數(shù)可以同時過濾tag的多個屬性:
<code>soup.find_all(href=re.compile("elsie"), id='link1')
// [<a class="sister" id="link1">three</a>]</code>

有些tag屬性在搜索不能使用,比如HTML5中的 data-* 屬性:
<code>data_soup = BeautifulSoup('<div data-foo="value">foo!</div>')data_soup.find_all(data-foo="value")
// SyntaxError: keyword can't be an expression</code>

但是可以通過 find_all()方法的 attrs 參數(shù)定義一個字典參數(shù)來搜索包含特殊屬性的tag:
<code>data_soup.find_all(attrs={"data-foo": "value"})
// [<div data-foo="value">foo!</div>]</code>

按CSS搜索

按照CSS類名搜索tag的功能非常實用,但標識CSS類名的關(guān)鍵字 class 在Python中是保留字,使用 class 做參數(shù)會導致語法錯誤.從BeautifulSoup的4.1.1版本開始,可以通過 class_ 參數(shù)搜索有指定CSS名的tag:
<code>soup.find_all("a", class_="sister")
// [<a class="sister" id="link1">Elsie</a>,
//<a class="sister" id="link2">Lacie</a>,
//<a class="sister" id="link3">Tillie</a>]</code>

class_ 參數(shù)同樣接受不同類型的 過濾器 ,字符串,正則表達式,方法或 True :
<code>soup.find_all(class_=re.compile("itl"))
//[<p class="title"><b>The Dormouse's story</b></p>]def has_six_characters(css_class): return css_class is not None and len(css_class) == 6soup.find_all(class_=has_six_characters)
//[<a class="sister" id="link1">Elsie</a>,
//<a class="sister" id="link2">Lacie</a>,
//<a class="sister" id="link3">Tillie</a>]</code>

tag的 class 屬性是 多值屬性 .按照CSS類名搜索tag時,可以分別搜索tag中的每個CSS類名:
<code>css_soup = BeautifulSoup('<p class="body strikeout"></p>')css_soup.find_all("p", class_="strikeout")
//[<p class="body strikeout"></p>]css_soup.find_all("p", class_="body")
//[<p class="body strikeout"></p>]</code>

搜索 class 屬性時也可以通過CSS值完全匹配:
<code>css_soup.find_all("p", class_="body strikeout")# [<p class="body strikeout"></p>]</code>

完全匹配 class 的值時,如果CSS類名的順序與實際不符,將搜索不到結(jié)果:
<code>soup.find_all("a", attrs={"class": "sister"})
//[<a class="sister" id="link1">Elsie</a>,
//<a class="sister" id="link2">Lacie</a>,
//<a class="sister" id="link3">Tillie</a>]</code>

string參數(shù)

通過 string 參數(shù)可以搜搜文檔中的字符串內(nèi)容.與 name 參數(shù)的可選值一樣, string 參數(shù)接受 字符串 , 正則表達式 , 列表, True . 看例子:
<code>
soup.find_all(string="Elsie")
//[u'Elsie']soup.find_all(string=["Tillie", "Elsie", "Lacie"])
//[u'Elsie',u'Lacie',u'Tillie']
soup.find_all(string=re.compile("Dormouse"))
//[u"The Dormouse's story", u"The Dormouse's story"]
def is_the_only_string_within_a_tag(s):
""Return True if this string is the only child of its parent tag.""
return (s == s.parent.string)soup.find_all(string=is_the_only_string_within_a_tag)
//[u"The Dormouse's story", u"The Dormouse's story", u'Elsie', u'Lacie', u'Tillie', u'...']</code>

雖然 string參數(shù)用于搜索字符串,還可以與其它參數(shù)混合使用來過濾tag.Beautiful Soup會找到 .string 方法與 string 參數(shù)值相符的tag.下面代碼用來搜索內(nèi)容里面包含“Elsie”的a標簽:
<code>soup.find_all("a", string="Elsie")# [<a class="sister" id="link1">Elsie</a>]</code>

limit參數(shù)

find_all()方法返回全部的搜索結(jié)構(gòu),如果文檔樹很大那么搜索會很慢.如果我們不需要全部結(jié)果,可以使用 limit 參數(shù)限制返回結(jié)果的數(shù)量.效果與SQL中的limit關(guān)鍵字類似,當搜索到的結(jié)果數(shù)量達到 limit 的限制時,就停止搜索返回結(jié)果.文檔樹中有3個tag符合搜索條件,但結(jié)果只返回了2個,因為我們限制了返回數(shù)量:
<code>soup.find_all("a", limit=2)
//[<a class="sister" id="link1">Elsie</a>,
//<a class="sister" id="link2">Lacie</a>]</code>

recursive參數(shù)

調(diào)用tag的 find_all() 方法時,Beautiful Soup會檢索當前tag的所有子孫節(jié)點,如果只想搜索tag的直接子節(jié)點,可以使用參數(shù) recursive=<code>False.</code>
一段簡單的文檔:
<code><html> <head> <title> The Dormouse's story </title> </head>...</code>

是否使用 recursive參數(shù)的搜索結(jié)果:
<code>soup.html.find_all("title")# [<title>The Dormouse's story</title>]soup.html.find_all("title", recursive=False)# []</code>

這是文檔片段
<code><html> <head> <title> The Dormouse's story </title> </head> ...</code>

<title>標簽在 <html> 標簽下, 但并不是直接子節(jié)點, <head> 標簽才是直接子節(jié)點. 在允許查詢所有后代節(jié)點時 Beautiful Soup 能夠查找到 <title> 標簽. 但是使用了 recursive=False 參數(shù)之后,只能查找直接子節(jié)點,這樣就查不到 <title> 標簽了.
Beautiful Soup 提供了多種DOM樹搜索方法. 這些方法都使用了類似的參數(shù)定義. 比如這些方法: find_all(): name, attrs, text, limit. 但是只有 find_all() 和 find() 支持 recursive 參數(shù).
</blockquote></a>

最后我用for遍歷了一下所有標簽,但是我們要的是標簽里面href的值刀崖,所以要這么寫:
<code>a['href']</code>
這樣惊科,我們就能打印出所有的鏈接,但是下載的部分那天是在太晚了亮钦,所以就沒去看那個下載方法怎么使用馆截,直接在網(wǎng)上找了一段代碼,果然出錯誤了蜂莉,咱們下次再說

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜡娶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子映穗,更是在濱河造成了極大的恐慌窖张,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚁滋,死亡現(xiàn)場離奇詭異宿接,居然都是意外死亡赘淮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門睦霎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梢卸,“玉大人,你說我怎么就攤上這事副女「蚋撸” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵肮塞,是天一觀的道長襟齿。 經(jīng)常有香客問我,道長枕赵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任位隶,我火速辦了婚禮拷窜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涧黄。我一直安慰自己篮昧,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布笋妥。 她就那樣靜靜地躺著懊昨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪春宣。 梳的紋絲不亂的頭發(fā)上酵颁,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音月帝,去河邊找鬼躏惋。 笑死,一個胖子當著我的面吹牛嚷辅,可吹牛的內(nèi)容都是我干的簿姨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼簸搞,長吁一口氣:“原來是場噩夢啊……” “哼扁位!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起趁俊,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤域仇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后则酝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體殉簸,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡闰集,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了般卑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片武鲁。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蝠检,靈堂內(nèi)的尸體忽然破棺而出沐鼠,到底是詐尸還是另有隱情,我是刑警寧澤叹谁,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布饲梭,位于F島的核電站,受9級特大地震影響焰檩,放射性物質(zhì)發(fā)生泄漏憔涉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一析苫、第九天 我趴在偏房一處隱蔽的房頂上張望兜叨。 院中可真熱鬧,春花似錦衩侥、人聲如沸国旷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跪但。三九已至,卻和暖如春峦萎,著一層夾襖步出監(jiān)牢的瞬間屡久,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工骨杂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涂身,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓搓蚪,卻偏偏與公主長得像蛤售,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子妒潭,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

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