昨天用python寫了乙個天氣預報採集,今天趁著興頭寫個新聞採集的。
接下來分解目標,一步一步地做。
我們都知道html鏈結的標籤是「a」,鏈結的屬性是「href」,也就是要獲得html中所有tag=a,attrs=href 值。
查閱了資料,一開始我打算用htmlparser,而且也寫出來了。但是它有乙個問題,就是遇到中文字元的時候無法處理。
1後來使用了sgmlparser,它就沒有這個問題。class
parser(htmlparser.htmlparser):
2def
handle_starttag(self, tag, attrs):
3if tag == 'a'
:4for attr, value in
attrs:
5if attr == '
href':
6print value
1sgmlparser針對某個標籤都需要過載它的函式,這裡是把所有的鏈結放到該類的urls裡。class
urlparser(sgmlparser):
2def
reset(self):
3sgmlparser.reset(self)
4 self.urls =56
defstart_a(self,attrs):
7 href = [v for k,v in attrs if k=='
href
'] 8if
href:
9 self.urls.extend(href)
1 lparser = urlparser()#這樣子就把所有符合條件的鏈結都儲存到urls.txt檔案裡了。分析器來的
2 socket = urllib.urlopen("
")#開啟這個網頁
34 fout = file('
urls.txt
', '
w')#
要把鏈結寫到這個檔案裡
5 lparser.feed(socket.read())#
分析啦6
7 reg = '
a/.*'#
這個是用來匹配符合條件的鏈結,使用正規表示式匹配
8 pattern =re.compile(reg)910
for url in lparser.urls:#
鏈結都存在urls裡
11if
pattern.match(url):
12 fout.write(url+'\n'
)1314 fout.close()
很簡單,只需要開啟urls.txt檔案,一行一行地讀出來就可以了。
也許這裡會顯得多此一舉,但是基於我對解耦的強烈願望,我還是果斷地寫到檔案裡了。後面如果採用物件導向程式設計,重構起來是十分方便的。
獲取網頁內容部分也是相對簡單的,但是需要把網頁的內容都儲存到乙個資料夾裡。
這裡有幾個新的用法:
1 os.getcwd()#有了這些方法,將字串儲存到某個資料夾下不同的檔案就不再是一件困難的事了。獲得當前資料夾路徑
2 os.path.sep#
當前系統路徑分隔符(是這個叫法嗎?)windows下是「\」,linux下是「/」34
#判斷資料夾是否存在,如果不存在則新建乙個資料夾
5if os.path.exists('
newsdir
') ==false:
6 os.makedirs('
newsdir')
78#str()用來將某個數字轉為字串
9 i = 5
10 str(i)
步驟3:列舉每乙個網頁,根據正則匹配獲得目標資料。
下面的方法是用來遍歷資料夾的。
1遍歷,讀取,匹配,結果就出來了。#這個是用來遍歷某個資料夾的
2for parent, dirnames, filenames in
os.walk(dir):
3for dirname in
dirnames
4print
parent, dirname
5for filename in
filenames:
6print parent, filename
我使用的資料提取的正規表示式是這樣的:
reg = '另外一點就是通過正規表示式的提取肯定不是主流的提取方法,如果需要採集其他**,就需要變更正規表示式,這可是一件比較麻煩的事情。.*?.*?(.*?).*?(.*?).*?(.*?)
'
提取之後觀察可知,正文部分總是會參雜一些無關資訊,比如「」「
」等等。所以我再通過正規表示式將正文切片。
1到此整個採集也就結束了。def func(str):#
誰起的這個名字
2 strs = re.split("
||[0-9]+;||<.>
", str)#
各種匹配,通過「|」分隔
3 ans = ''4#
將切分的結果組合起來
5for each in
strs:
6 ans +=each
7return ans
展示一下我提取到的結果(不使用自動換行,右邊隱藏了):
注意:1、開啟某個**的時候,如果**是壞的(打不開),若不處理則會報錯。我簡單地使用處理異常的方式,估計應該有其他方式。
try2、python正規表示式中的「.」號,可以匹配任意字元,但是除了「\n」。: socket =urllib.urlopen(url)
except
:
continue
3、如何去除字串末尾的「\n」?python的處理簡直優雅到死啊!
1if line[-1] == '\n'
:2 line = line[0:-1]
Python 網路爬蟲(新聞採集指令碼)
爬蟲原理 通過python訪問新聞首頁,獲取首頁所有新聞鏈結,並存放至url集合中。逐一取出集合中的url,並訪問鏈結獲取原始碼,解析出新的url鏈結新增到集合中。為防止重複訪問,設定乙個歷史訪問,用於對新新增的url進行過濾。解析dom樹,獲取文章相關資訊,並將資訊儲存到article物件中。將a...
Python抖音 資料自動化採集 多開
def response flow url 篩選出以上面url為開頭的url if flow.request.url.startswith url text flow.response.text 將已編碼的json字串解碼為python物件 content json.loads text comme...
python 實現問卷星自動填寫多份
工具 burpsuit,python 問卷星親測,可以用python的requests庫對問卷訪問填寫。首先對訪問的頁面進行抓包,得到的header部分照抄到requests的header裡。親測乙個ip只能填寫三份問卷,所以這裡再指令碼上加入隨機的 頭部 指令碼如下 import requests...