您的位置:首页 > 编程语言 > Python开发

Python练习-先从网上爬几个笑话

2016-10-14 00:44 239 查看

Python爬虫,可以简单理解为用python去访问一个网站,获得该网站的内容。

网页的本质就是文本,我们能在本地通过
file = open('file.txt', 'r')
打开一个文本文件,获取其中的字符串,我们也同样能使用一些方法,在打开网络中的一个文件(就是网页)。

搜一些关于 “Python 网络请求”,”Python 爬虫”的关键字,很容易发现一个叫 “requests”的python库,很多人都推荐用它来做爬虫。所以,随大流吧~

安装 requests

requests库并不是python自带的一个库,要想使用它需要先从网上下载安装。搜关键字“python requests 安装”看看吧。

我看的这个:http://www.tuicool.com/articles/eiM3Er3/

我选择用pip安装,感觉pip用的挺多,装各种库,挺方便,于是先装个pip。

安装pip

https://pypi.python.org/pypi/pip#downloads下载pip的python源文件:



解压到Python 3.5的安装目录下:



打开cmd,进入该解压出的文件夹的路径,执行
python setup.py install
:

(请确保Python 3.5已添加到环境变量,如果有python 2.7的环境变量,最好先删掉。。)



安装完后,在 /Python35/Srcipts 目录下可以看到pip.exe什么的。

刚刚解压出的pip-8.1.2文件夹也可以删掉了。

使用pip安装request

教程上说把 /Python35/Srcipts 路径添加到环境变量就可以在任何路径下使用pip命令了,但遗憾的是我试了不行,只能在控制台中 cd 到 /Python35/Srcipts 路径下再使用 pip 命令了。。。

在cmd中cd 到 /Python35/Srcipts 路径下

执行
pip install requests
安装requests。

执行
pip list
可以查看已经安装过哪些库。



小试requests,做一个网络请求

看着这个教程:http://www.cnblogs.com/EvileOn/p/5517235.html 学一下requests库的基本操作,发现很简单是不是,而且很多操作暂时还用不到。

开始动手做,只使用requests.get()方法:

新建一个python文件,写下如下代码:

import requests         # 导入requests库

# 使用requests库访问taobao网(向淘宝网做get请求)
html = requests.get('http://www.taobao.com/')

print(html.text)        # 打印网页中的文本


执行后你就可以看到华丽丽的淘宝首页源代码了,别忘了,这些东西在浏览器中打开,就是淘宝首页呀!

从笑话网站爬笑话

我找了一个目标网站:http://www.jokeji.cn/list.html

感觉这个网站挺简单,不用登陆,没有复杂的功能,好爬~

可以现在浏览器中访问这个链接看一下效果,你会发现这个页面是个目录,有很多笑话页面的链接。

还是先使用简单的代码试试有没有效果:

import requests         # 导入requests库
jokePage = requests.get('http://www.jokeji.cn/list.htm')
print(jokePage.text)


这样就打印出了这个页面的源代码,细心一点你会发现源码里的中文是乱码,有经验的都知道肯定和网页的编码有关系,直接在源码里看一下网页信息:



知道这个网页的编码是gbk,所以也给我们从网上取到的request设置下编码:

import requests         # 导入requests库
jokePage = requests.get('http://www.jokeji.cn/list.htm')
jokePage.encoding = 'gbk'
print(jokePage.text)


再试试看,就没乱码了吧。

有了网站的源码,就要去分析这个源码,找到我们想要的内容了。

爬取每个笑话页面的连接

刚刚我们爬的那个页面,是所有笑话的目录,每个目录是一个链接,打开链接才能看到笑话的内容,所以我们要从刚刚爬取的页面中,提取所有的笑话页面链接。

* 网页就是文本,我们要从一个网页中爬取我们想要的内容,就是处理字符串 *。所以,分析刚刚爬取的页面,找到其中所有的笑话页面链接地址。

我喜欢用chrome的开发者工具(F12)查看一个网页的内容,通过这个工具很容易找到每个笑话页面的连接:



可以简单的认为,一个笑话页面的链接,都是如下结构的:
/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“才能真正访问到链接所对应的网页!

利用爬到的笑话网页链接去访问笑话页面

简单点,先访问我们获取到的第一个链接,既
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         # 导入requests库
import re               # 导入正则表达式库
jokePage = requests.get('http://www.jokeji.cn/list.htm')
jokeList = re.findall('/jokehtml/[\w]+/[0-9]+.htm',jokePage.text)   # 使用正则表达式找到所有笑话页面的链接
jokePage.encoding = 'gbk'
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的什么功能。

其实就是学会了用代码去访问网页!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: