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的什么功能。
其实就是学会了用代码去访问网页!
相关文章推荐
- Python爬取网上笑话并定时邮件发送--P.S.想经常收笑话的同学,可以邮件我
- python基础练习----输入一个奇数,然后判断最少几个 9 除于该数的结果为整数
- python练习-从网上下载一个文件并打印出来
- python基础练习之几个简单的游戏
- 熟能生巧,几个PYTHON练习--Python(6)
- 网上最流行的12个含蓄的笑话!
- 再添加几个python资源
- 一个网上下载的ftp类(修改了其中几个bug)
- 在论坛中找到的几个关于Python的小问题的解决方法
- 中国人都喜欢的几个笑话。。。
- 几个笑话
- 几个笑死你的小笑话
- 几个经典的笑话(图)
- 今天遇到的几个Python问题
- 几个笑话
- ActionListener ItemListener 和几个SWING组件的练习
- python几个内置函数之-filter,map,reduce
- 中国人都喜欢的几个笑话。。。
- 昨天晚上看到的几个简短小笑话:)