学习python有一段时间了,也写了第一个爬虫,一直没有时间总结一下,学习的时候看了不少博客分享了自己的爬虫思路和代码,感觉其中一些比较冗长且缺乏条理,因此今天希望通过自己的第一个爬虫来总结下python写爬虫的思路。
1.写爬虫的思路和步骤
首先要有一个大致的思路,这样写代码就会非常顺畅,那么些爬虫的思路是什么呢?我认为是根据自己要写的功能,一块一块的写。比如,我要写一个爬虫实现爬取网页指定内容,并保存成一个文件,那么主要的步骤就应该是:
(1)爬取指定网页内容,这里利用python3的requests模块即可,Python的强大之处就是各种现成的模块太好用了,所谓前人栽树后人乘凉,直接调用各种功能会打打提高效率。requests模块的主要功能就是爬取内容,最常用的就是requests.get(),填入url为地址,这里明确两点,首先requests模块是一个复数,新手有时候会写成request单数,导致无法识别报错;其次,用requests.get的内容是HTTP的response体,是网页中的HTML源代码中的一部分,对这个response可以选择进行存储,不过一般我们不会在这里存储,因为截取的信息不是我们全部都想要。
(2)用request获得response的内容之后,因为它是HTML格式的文本,所以可能存在各种乱七八糟的字符,比如空格,以及各种标签,因此我们要对获得的信息进行一个提取,或者叫数据清洗,去掉其中不需要的数据,这里我们主要用到的是re模块,对指定的字符进行替换,一般使用re.sub()进行替换,括号内需要填入一些参数,大家可以自行百度。那么有个问题,我们需要先对数据进行一个解析或者识别,才能够进行替换处理,这时候就要用到bs4,我们一般用它来解析返回的response,将其解析为文本,然后再用re进行替换;一般用到的代码为:
bs = BeautifulSoup(html, ‘html.parser’),里面的参数分别是返回体的格式以及用什么解析器解析,参数根据需要调整,不明白的可以自行百度.然后我们一般需要获取其中的部分内容,需要给需要获取的内容起个变量名,然后将解析后的内容当做值赋给它,如:
mid=bs.title.string
这里mid是我给变量起的名字,赋给它的值是返回包中title标签之间的内容,获取的内容为字符串
(3)获取完内容,也解析好了,就要进行数据清洗了,这里主要是利用re+正则来进行清洗,替换掉不想要的字符,那么就需要用正则对想删掉的数据进行定位,如:我想对上面解析后的文本,提取其中的一部分内容,代码为
username=re.sub(’_.*$’,"",mid)
这里username就是我最终经历数据下载、定位、清洗后需要输出的变量,re.sub()中的三个参数分别是,正则表达式,为了进行数据匹配和定位;要替换成的字符串(这里为空);要进行处理的变量。
(4)终于走到最后一步,数据处理好后,我们可以直接print,但一般数据量大的话,希望把它保存在一个文件中,那么就需要如下代码:
fb=open(‘20.txt’,‘w+’,encoding=‘utf-8’)
#20.txt为我们想保存的文件名和格式,w+是给文本读写权限,encoding指定保存文本的编码
fb.write(username)**
#将我们获取和处理后的数据写入文本
总结一下,爬虫用到了几个关键的东西:
- 1.requests,用它来给服务器发请求以获得response
2.bs4,用来对response的内容进行解析,使其变成文本,并提取指定的内容(这里是提取指定内容,但不是数据清洗,因为是提取,并没有删除东西)
3.re模块,re.sub进行数据清洗,把不想要的数据替换掉,如果想删除直接替换成空,这里需要用到正则表达式,而且可以使用response中的HTML标签进行定位,只要该标签是唯一的就可以作为标志位,感兴趣的可以自己查查。
4.首先新建一个变量来打开一个空的文件,给其赋好文件名和格式,然后让该变量调用write来把获取的文本写入文件并保存。
2.我的代码
根据以上思路写了一个爬虫,功能为爬取目标网站title内容中的某些部分(可以通过正则修改想要爬取的东西),贴出代码供参考,也可以对其中的一些参数进行修改后直接使用,可以实现一些简单的爬取数据功能,代码如下:
#--coding:GBK --
import requests
from bs4 import BeautifulSoup
import re
url=‘https://zhidao.baidu.com/question/176982986770397124.html’
r=requests.get(url)
bs = BeautifulSoup(r.content, ‘html.parser’)
mid=bs.title.string
username=re.sub(’?.*$’,"",mid)
fb=open(‘20.txt’,‘w+’,encoding=‘utf-8’)
fb.write(username)
exit()
涉及到目录比较复杂,层级结构比较多的网站,需要写很多正则,嵌套很多代码,使用很多中间变量,在此暂时不讨论,仅分析爬虫的思路和步骤,并写一个简单的爬虫,下一步的思路是准备写一个功能较为复杂的爬虫爬取小说网上的小说,按照其章节爬取后进行保存,留待后续补充代码和思路。