import urllib #python中用于擷取網站的子產品
import urllib2, cookielib
有些網站通路時需要cookie的,python處理cookie代碼如下:
cj = cookielib.CookieJar ( )
opener = urllib2.build_opener( urllib2.HttpCookieProcessor(cj) )
urllib2.install_opener (opener)
通常我們需要在網站中搜尋得到我們需要的資訊,這裡分為二種情況:
1. 第一種,直接改變網址就可以得到你想要搜尋的頁面:
def GetWebPage( x ): #我們定義一個擷取頁面的函數,x 是用于呈遞你在頁面中搜尋的内容的參數
url = \'http://xxxxx/xxx.cgi?&\' + ‘你想要搜尋的參數’ # 結合自己頁面情況适當修改
page = urllib2.urlopen(url)
pageContent = page.read( )
return pageContent #傳回的是HTML格式的頁面資訊
2.第二種,你需要用到post方法,将你搜尋的内容放在postdata裡面,然後傳回你需要的頁面
def GetWebPage( x ): #我們定義一個擷取頁面的函數,x 是用于呈遞你在頁面中搜尋的内容的參數
url = \'http://xxxxx/xxx\' #這個網址是你進入搜尋界面的網址
postData = urllib.urlencode( { 各種‘post’參數輸入 } ) #這裡面的post參數輸入需要自己去查
req= urllib2.Request (url, postData)
pageContent = urllib2.urlopen (req). read( )
return pageContent #傳回的是HTML格式的頁面資訊
在擷取了我們需要的網頁資訊之後,我們需要從獲得的網頁中進一步擷取我們需要的資訊,這裡我推薦使用 BeautifulSoup 這個子產品, python自帶的沒有,可以自行百度谷歌下載下傳安裝。 BeautifulSoup 翻譯就是‘美味的湯’,你需要做的是從一鍋湯裡面找到你喜歡吃的東西。
import re # 正規表達式,用于比對字元
from bs4 import BeautifulSoup # 導入BeautifulSoup 子產品
soup = BeautifulSoup(pageContent) #pageContent就是上面我們搜尋得到的頁面
soup就是 HTML 中所有的标簽(tag)BeautifulSoup處理格式化後的字元串,一個标準的tag形式為:
hwkobe24
通過一些過濾方法,我們可以從soup中擷取我們需要的資訊:
(1) find_all ( name , attrs , recursive , text , **kwargs)
這裡面,我們通過添加對标簽的限制來擷取需要的标簽清單, 比如 soup.find_all (\'p\') 就是尋找名字為‘p’的 标簽,而soup.find_all (class = "tittle") 就是找到所有class屬性為"tittle" 的标簽,以及soup.find_all ( class = re.compile(\'lass\')) 表示 class屬性中包含‘lass’的所有标簽,這裡用到了正規表達式(可以自己學習一下,非常有用滴)
當我們擷取了所有想要标簽的清單之後,周遊這個清單,再擷取标簽中你需要的内容,通常我們需要标簽中的文字部分,也就是網頁中顯示出來的文字,代碼如下:
tagList = soup.find_all (class="tittle") #如果标簽比較複雜,可以用多個過濾條件使過濾更加嚴格
for tag in tagList:
print tag.text
f.write ( str(tag.text) ) #将這些資訊寫入本地檔案中以後使用
(2)find( name , attrs , recursive , text , **kwargs )
它與 find_all( ) 方法唯一的差別是 find_all() 方法的傳回結果是值包含一個元素的清單,而 find() 方法直接傳回結果
(3)find_parents( ) find_parent( )
find_all() 和 find() 隻搜尋目前節點的所有子節點,孫子節點等.
find_parents() 和 find_parent() 用來搜尋目前節點的父輩節點,搜尋方法與普通tag的搜尋方法相同,搜尋文檔搜尋文檔包含的内容
(4)find_next_siblings() find_next_sibling()
這2個方法通過 .next_siblings 屬性對當 tag 的所有後面解析的兄弟 tag 節點進代, find_next_siblings() 方法傳回所有符合條件的後面的兄弟節點,find_next_sibling() 隻傳回符合條件的後面的第一個tag節點
(5)find_previous_siblings() find_previous_sibling()
這2個方法通過 .previous_siblings 屬性對目前 tag 的前面解析的兄弟 tag 節點進行疊代, find_previous_siblings()方法傳回所有符合條件的前面的兄弟節點, find_previous_sibling() 方法傳回第一個符合條件的前面的兄弟節點
(6)find_all_next() find_next()
這2個方法通過 .next_elements 屬性對目前 tag 的之後的 tag 和字元串進行疊代, find_all_next() 方法傳回所有符合條件的節點, find_next() 方法傳回第一個符合條件的節點
(7)find_all_previous() 和 find_previous()
這2個方法通過 .previous_elements 屬性對目前節點前面的 tag 和字元串進行疊代, find_all_previous() 方法傳回所有符合條件的節點, find_previous()方法傳回第一個符合條件的節點。
實際代碼示例:(爬取網頁下的指定連結)
from bs4 imp
#html文本
html_text=""
soup=BeautifulSoup(html_text,\'html.parser\')
a=soup.select(\'a\')
for i in a:
if i.string=="關鍵詞":
findb_ur=i[\'href\']
#輸出通過搜尋a标簽中的字元串獲得網頁連結
# print(findb_url)
#findb_url="https:"+finburl
alist=soup.find_all(\'a)
for a in alist:
1.通過下标操作的方式
href=a[\'href\']
print(htref)
2.通過attrs屬性的方式
href=a.attrs[\'href\']
print(href)
