爬虫练习一(爬取笑话集)

时间:2022-09-18 17:19:58

爬取笑话集网页

目标网址为: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的什么功能。实际上学会了用代码去访问网页!