python3自动爬笑话


学校的服务器可以上外网了,所以打算写一个自动爬取笑话并发到bbs的东西,从网上搜了一个笑话网站,感觉大部分还不太冷,html结构如下:



        可以看到,笑话的链接列表都在<div class="list_title">里面,用正则表达式可以把最近的几个笑话地址找出来,再进到一个笑话页面看下:



        每一个笑话页面里面是有多个小笑话组成的,全部在<span id="text110">标签下,每个小笑话又单独一个<p>包裹,这样非常容易就可以把每个单独笑话放到一个list中。由于我爬笑话的目的是每天白天一个小时发一个笑话,所以爬取20个是足够的了,每个页面平均有5个小笑话,爬4个页面就OK啦。这里有几个细节,这个笑话网有的链接是有中文的,比如:

  1. <a href="/jokehtml/冷笑话/2014051200030765.htm" target="_blank">读书破万卷,搞笑如有神</a>  
<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()  
import urllib.request
import urllib.parse
import re

rule_joke=re.compile('<span id=\"text110\">([\w\W]*?)</span>')
rule_url=re.compile('<a href=\"(.*?)\"target=\"_blank\" >')
mainUrl='http://www.jokeji.cn'
url='http://www.jokeji.cn/list.htm'

req=urllib.request.urlopen(url)
html=req.read().decode('gbk')
urls=rule_url.findall(html)
f=open('joke.txt','w')
for i in range(4):
	url2=urllib.parse.quote(urls[i])
	joke_url=mainUrl+url2
	req2=urllib.request.urlopen(joke_url)
	html2=req2.read().decode('gbk')
	joke=rule_joke.findall(html2)
	jokes=joke[0].split('<P>')
	
	for i in jokes:
		i=i.replace('</P>','')
		i=i.replace('<BR>','')
		i=i[2:]
		f.write(i)
f.close()

看下爬取的结果:



        这样,每行是一个单独的笑话,方便其他程序使用。


转自http://blog.csdn.net/littlethunder/article/details/25693641

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值