Python多篇新聞自動採集

2022-02-16 05:08:45 字數 3289 閱讀 4975

昨天用python寫了乙個天氣預報採集,今天趁著興頭寫個新聞採集的。

接下來分解目標,一步一步地做。

我們都知道html鏈結的標籤是「a」,鏈結的屬性是「href」,也就是要獲得html中所有tag=a,attrs=href 值。

查閱了資料,一開始我打算用htmlparser,而且也寫出來了。但是它有乙個問題,就是遇到中文字元的時候無法處理。

1

class

parser(htmlparser.htmlparser):

2def

handle_starttag(self, tag, attrs):

3if tag == 'a'

:4for attr, value in

attrs:

5if attr == '

href':

6print value

後來使用了sgmlparser,它就沒有這個問題。

1

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)

sgmlparser針對某個標籤都需要過載它的函式,這裡是把所有的鏈結放到該類的urls裡。

1 lparser = urlparser()#

分析器來的

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檔案裡了。

很簡單,只需要開啟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、開啟某個**的時候,如果**是壞的(打不開),若不處理則會報錯。我簡單地使用處理異常的方式,估計應該有其他方式。

try

: socket =urllib.urlopen(url)

except

:

continue

2、python正規表示式中的「.」號,可以匹配任意字元,但是除了「\n」。

3、如何去除字串末尾的「\n」?python的處理簡直優雅到死啊!

1

if 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...