暑假想提升一下Python的扩展度(闲的没事),就在网上自学了爬虫,过程比较枯燥,但是程序写出来并且运行成功的那一刻是非常有成就感的,所以想写一篇关于简单的文字爬虫的教程(单线程到多线程),也算是一种总结吧!
本文分两个部分:
1.爬虫开发需要的工具
2.开始编写程序(简易爬虫)
下面就让我们开始吧!
一、爬虫需要的工具安装
工具选择
”工欲善其事,必先利其器“,Python爬虫开发有比较多的工具选择,这里我选择的是比较方便的 BeautifulSoup4 + requests(http://www.python-requests.org/zh_CN/latest/) 这两个库是第三方库,其中requests有作者的中文详解(已附上链接)。
工具安装
1、在Pycharm中安装:
文件选项卡——设置——项目:PythonProject——Python解释器——单击右边软件包上方的 ”+“ ——搜索并安装上述两个第三方库。
2、在命令提示符环境中按安装:
输入: pip intall + ”你要安装库的名称“——回车。
了解所需要的工具
requests就像是一个抓手,把我们所需要的信息通过你给的URL从互联网上抓取过来,BeautufuSoup就像是筛子一样,过滤出我们所需要的内容。
二、开始编写
OK,有了工具,接下来就是开始编写程序了,首先是引用:
import requests as reqfrom bs4 import BeautifulSoup as bs
as 就相当于给引用的函数另外起一个名,因为函数之前的名字太复杂了,我们嫌它长。
接着,我们来爬取一个小说网站(因为这个网站没有反爬虫,也没有线程限制所以适合练手):https://www.biqooge.com(笔趣阁)。
然后我们来编写代码对小说网站的首页进行爬取:
import requests as req
from bs4 import BeautifulSoup as bs
html='https://www.bqkan8.com'#写入网址
txt=req.get(url=html)#对该网址进行爬取
print(txt.text)
为什么输出的时候需要后面加一个text呢,是因为我们需要把爬取过来的内容转换成文本内容,这样我们才看得懂
接着,对首页网站爬取的内容进行分析我们发现,这样的一段东西:
那么,根据得到的图片信息,我们很快就能得到,这些信息指向的是小说的目录网址,但是,他给我们的不像是网址啊。
观察仔细的应该已经发现了“href=” 这个后面跟着的,就是这个小说在该服务器的存放地址,就像是存在我们自己电脑某某盘下面的文件一样,那么我们把这个复制到原先的URL后面去并运行程序:
这上面有许多我们不要的广告以及其他小说的推荐,那么我们怎样才能单独提取出自己所需要的小说目录呢?
分析得到的结构,我们发现,这个返回值是呈一个包含结构的,就像我们保存文件一样,我们所需要的不包括这些乱七八糟的,所以,在文章目录上面,有一个<div class="listmain">,网页标签,我们需要的内容就在这个网页标签下面。
编写程序如下:
import requests as req
from bs4 import BeautifulSoup as bs
html='https://www.bqkan8.com/1_1496'#写入网址
txt=req.get(url=html)#对该网址进行爬取
txt=bs(txt.text,'html.parser') #这里的txt可以换成content
txt=txt.find_all('div',class_='listmain') #对目标进行筛选
print(txt)
第五行代码的意思是 创建一个BeautifulSoup对象,并且后面跟着的content我个人的理解是对这个对象进行编码属性的定义,这个content也可以换成text,而后面的’html.parser‘是用来解析这个对象。
第六行的意思是在txt里面寻找标签为’div‘,class属性为’listmain‘的内容
我们看一下运行结果:
那么,根据得到的地址,我们来爬取第一章的内容:
这时候我们不知道第一章内容的属性和标签,就不能使用BeautifulSopu,先是爬取整个页面,再来继续分析得到的内容:
直接看正文上方的标签,OK,得到了标签,再编写如下代码:
import requests as req
from bs4 import BeautifulSoup as bs
html='https://www.bqkan8.com/1_1496/450365.html'#写入网址
txt=req.get(url=html)#对该网址进行爬取
txt=bs(txt.text,'html.parser')
txt=txt.find_all('div',id='content')
print(txt)
运行得到:
作为一个简易爬虫,这确实是成功了,但是这样影响美观,所以我们要将其中的标签给他去掉,修饰修饰
编写代码如下:
import requests as req
from bs4 import BeautifulSoup as bs
html='https://www.bqkan8.com/1_1496/450365.html'#写入网址
txt=req.get(url=html)#对该网址进行爬取
txt=bs(txt.text,'html.parser')
txt=txt.find_all('div',id='content')
txt=(str(txt).replace('<br/><br/>',''))
print(txt.replace(' ','\n\n'))
第八行代码 中那空格是html语言中的换行符,通过对代码的修改我们就得到了比较美观的的返回文字:
至此,我们完成了一个简单的爬虫编写。