爬取笑话集网页
目标网址为:http://www.jokeji.cn/list.html
感觉这个网站挺简单,不用登陆,没有复杂的功能,好爬~
可以现在浏览器中访问这个链接看一下效果,你会发现这个页面是个目录,有很多笑话页面的链接。
还是先使用简单的代码试试有没有效果:
由于爬取的内容发现乱码,所以加上encoding
import requests # 导入requests库 jokePage = requests.get('http://www.jokeji.cn/list.htm') jokePage.encoding = 'gbk' print(jokePage.text)
爬取每个笑话页面的连接
刚刚我们爬的那个页面,是所有笑话的目录,每个目录是一个链接,打开链接才能看到笑话的内容,所以我们要从刚刚爬取的页面中,提取所有的笑话页面链接。
* 网页就是文本,我们要从一个网页中爬取我们想要的内容,就是处理字符串 *。所以,分析刚刚爬取的页面,找到其中所有的笑话页面链接地址。
可以简单的认为,一个笑话页面的链接,都是如下结构的:/jokehtml/***/****.htm"
,不信你可以去刚刚爬到的网页源码里面看看!
知道了笑话页面链接的结构,就可以从网页源码里把所有的链接提取出来啦,当然,要使用正则表达式!
import requests # 导入requests库 import re # 导入正则表达式库 jokePage = requests.get('http://www.jokeji.cn/list.htm') jokePage.encoding = 'gbk' jokeList = re.findall('/jokehtml/[\w]+/[0-9]+.htm',jokePage.text) # 使用正则表达式找到所有笑话页面的链接 print(jokeList)
利用爬到的笑话网页链接去访问笑话页面
简单点,先访问我们获取到的第一个链接,既 http://www.jokeji.cn + jokeList[0]
这个页面,访问的方法一样是用requests.get()
方法,代码如下:
import requests # 导入requests库 import re # 导入正则表达式库 jokePage = requests.get('http://www.jokeji.cn/list.htm') jokePage.encoding = 'gbk' jokeList = re.findall('/jokehtml/[\w]+/[0-9]+.htm',jokePage.text) # 使用正则表达式找到所有笑话页面的链接 jokeContent = requests.get('http://www.jokeji.cn/'+jokeList[1]) # 访问第一个链接 jokeContent.encoding = 'gbk' print(jokeContent.text)
比如我就发现,所有的笑话都在<p></p>
标签中,而且<p>
后面都跟了一个数字代表这个笑话的序号,而其他非笑话的 <p>
标签后就没有数字,所以可以用'<p>[0-9].*</p>'
这个简单的正则匹配到所有笑话!,把上面代码修改最后两句:
import requests # 导入requests库 import re # 导入正则表达式库 jokePage = requests.get('http://www.jokeji.cn/list.htm') jokePage.encoding = 'gbk' jokeList = re.findall('/jokehtml/[\w]+/[0-9]+.htm',jokePage.text) # 使用正则表达式找到所有笑话页面的链接 jokeContent = requests.get('http://www.jokeji.cn/'+jokeList[0]) # 访问第一个链接 jokeContent.encoding = 'gbk' jokes = re.findall('<P>[0-9].*</P>', jokeContent.text) # 利用正则找到页面中的所有笑话 print(jokes)
完整代码如下:
import requests import re jokePage = requests.get('http://www.jokeji.cn/list.htm') #取到笑话集完整网址 jokePage.encoding = 'gbk' # print(jokePage.text) #打印html页面 jokeList = re.findall('/jokehtml/[\w]+/[0-9]+.htm',jokePage.text) #匹配到所有的链接 print(jokeList) for jokeLink in jokeList: #取到每一个链接 jokeContent = requests.get('http://www.jokeji.cn/' + jokeLink) # 访问第一个链接 jokeContent.encoding = 'gbk' jokes = re.findall('<P>[0-9].*</P>', jokeContent.text) for joke in jokes: # 循环打印笑话 print(joke) print()
最后还是别忘了,这篇文章主要目的是练习使用requests库,别只顾看笑话了,想想爬笑话过程中用到了requests的什么功能。实际上学会了用代码去访问网页!