學校的伺服器可以上外網了,所以打算寫一個自動爬取笑話併發到bbs的東西,從網上搜了一個笑話網站,感覺大部分還不太冷,html結構如下: 可以看到,笑話的鏈接列表都在<div class="list_title">裡面,用正則表達式可以把最近的幾個笑話地址找出來,再進到一個笑話頁面看下: 每一個笑話頁 ...
學校的伺服器可以上外網了,所以打算寫一個自動爬取笑話併發到bbs的東西,從網上搜了一個笑話網站,感覺大部分還不太冷,html結構如下:
可以看到,笑話的鏈接列表都在<div class="list_title">裡面,用正則表達式可以把最近的幾個笑話地址找出來,再進到一個笑話頁面看下:
每一個笑話頁面裡面是有多個小笑話組成的,全部在<span id="text110">標簽下,每個小笑話又單獨一個<p>包裹,這樣非常容易就可以把每個單獨笑話放到一個list中。由於我爬笑話的目的是每天白天一個小時發一個笑話,所以爬取20個是足夠的了,每個頁面平均有5個小笑話,爬4個頁面就OK啦。這裡有幾個細節,這個笑話網有的鏈接是有中文的,比如:
1 <a href="/jokehtml/冷笑話/2014051200030765.htm" target="_blank">讀書破萬卷,搞笑如有神</a>
直接urllib.request.urlopen函數不能解析中文的URL,必須要urllib.parse先轉碼一下才能正確解析。還有一個細節是每段的小笑話之間是有換行的,用正則表達式的“.”是不能匹配換行符的,需要改成“[\w\W]”才能匹配。好了,下麵是代碼:
1 import urllib.request 2 import urllib.parse 3 import re 4 5 rule_joke=re.compile('<span id=\"text110\">([\w\W]*?)</span>') 6 rule_url=re.compile('<a href=\"(.*?)\"target=\"_blank\" >') 7 mainUrl='http://www.jokeji.cn' 8 url='http://www.jokeji.cn/list.htm' 9 10 req=urllib.request.urlopen(url) 11 html=req.read().decode('gbk') 12 urls=rule_url.findall(html) 13 f=open('joke.txt','w') 14 for i in range(4): 15 url2=urllib.parse.quote(urls[i]) 16 joke_url=mainUrl+url2 17 req2=urllib.request.urlopen(joke_url) 18 html2=req2.read().decode('gbk') 19 joke=rule_joke.findall(html2) 20 jokes=joke[0].split('<P>') 21 22 for i in jokes: 23 i=i.replace('</P>','') 24 i=i.replace('<BR>','') 25 i=i[2:] 26 f.write(i) 27 f.close()
看下爬取的結果:
這樣,每行是一個單獨的笑話,方便其他程式使用。