Python(二十一)网页爬虫第一部分

发布于:2022-12-08 ⋅ 阅读:(956) ⋅ 点赞:(0)

一. 项目:爬取douban网页的top250影视信息

二. 操作流程以及问题

1.使用urllib获取get和post请求

当我们想要解析一个网址的时候需要用到urllib,在Python2中urllib2是常用来解析网址的库,但是在Python3中重新进行了整合,直接使用urllib中的函数即可。

1.1获取一个get请求

# 首先我们引入urllib库中的request,并调用request下的urlopen函数,这样便可以解析该网址

# 将解析获得的数据放置在response中,也就是一个object,对象

之后调用read,读取对象中的内容:

 # 但是我们可以看到读取的内容相当凌乱,我们再对其解码的模式进行指定,指定为UTF-8: 

 然后我们将下方文件的内容复制粘贴到一个新建的HTML文件当中,并将其打开:

# 用VSCODE编辑并写入Object信息,保存后,打开该HTML文件,就进入了我们解析数据的来源网页,百度。

1.2获取一个post请求

注:post需要一个获取请求之后的相应才行,我们用一个网址来先进行测试

网址:httpbin.org

A simple HTTP Request & Response Service,该网址罗列出了遇到请求时候给出的相应,我们可以用这个网址来验证我们的请求是否有得到相应。

 # 点开POST,其中request url是可以为我们测试所用的网址,下面的response body就是请求的相应。

我们按照之前获取get请求的方式写一段代码:

# 发现这里会报错:METHOD NOT ALLOWED,这是因为获取post请求的时候,我们同时还要上传一个表单。

 # 我们引入urllib.parse,用来解析,同时定义一个data作为表单,其中包含我们要上传给网页的内容,并且规定了编码方式。并且在请求post时候,将data上传。执行结果如下:

 # 从中可以看到,我们收到的信息,都是测试网页标注的相应信息,测试成功。

注:当我们向其它网址发送请求的时候,有的会被拒绝(拒绝被爬),会出现“响应超时的情况”,一般处理这种情况,我们使用timeout来规定等待响应时间。

# 再用try,except的方式对timeout的异常进行处理即可。

 # 记得还要引入一个urllib.error

 2.隐藏自身爬取数据

当我们想要爬取一些网页的时候,当对方发现我们的身份后,是不会让我们来轻易爬取的,会给予拒绝,那我们还想要爬取该网页的数据的话,就需要对自身进行包装和隐藏。这里涉及一个新的引入的函数:urllib.request.Request

# 这个函数的相关参数定义,url是网址,data是要上传的表单,method则是请求方式,其中headers中包含各种我们自身的信息,比如cookies,比如user-agent等,这样标识了我们的身份,对方也是通过这个来判定是否接纳我们访问爬取。获取一套能够被网页接纳的信息的内容,最直接的办法是通过自身直接访问将信息拿来,还是拿百度举例:

# 我们进入百度的网页,按F12进入该页面,点击network,选中该网址的项目,就可以看到以下内容:

# 这些信息当中包含了我们本次访问的自身信息,而我们本次访问自然是成功的,那么用这些信息对自身进行包装再爬取,想必也是没有问题的;代码如下:

 # 定义好了本次Request请求的上传内容,以及包装内容,再发起urlopen解析请求,并将其打印出来,结果成功访问。

我们用上述方法来访问解析我们的目标网址:

 # Success

3.实操:定义一个函数解析URL

我们根据上述的方式在主程序中定义一个会用到的函数,对url进行解析:

测试该函数,成功运行并解析:

4.主程序的建设和预先排版:

 其实在进行上述操作之前,最应该先做的应该是将整个程序的架构排版出来:

 首先引入我们所需要的模块以及函数:

再定义一个主函数,标注上整个爬取的内容,进行简单的说明,方便滤清思路,顺便定义需要定义的变量。

 紧接着根据三个内容依次定义设置相应的函数架构:

这其中,我们最开始定义好的geturl()函数,是属于第二步getdata()当中会调用使用到的,我们将geturl函数定义好并放置在getdata的定义前面,同时在getdata中进行调用。

这其中有一个问题,我们调用geturl的时候是逐个页面进行爬取,但是如果我们想要爬取该网址全部250个电影,则需要逐个对网页进行解析。

5.程序以及子程序编写

我们来到该网页上可以看到:

 网址上在start=这里,写的内容是电影数量开始的内容,那么我们可以根据这个写一个for循环来逐页爬取网页数据:

# 这样我们就爬到了网页的数据,接下来我们要把目标数据逐个的进行解析,这里就用到了BeautifulSoup,我们通过该库对获取到的数据进行解析,并再通过for循环遍历其中符合条件的内容。

其中符合条件的内容需要我们到原网页上去确认,我们打开相应网页,并打开相应的解析器:

# 可以看到鼠标放到标注的位置上的时候,网页上对应的内容才是我们想要爬取的信息,我们该标签以及类属性作为条件:

 # 然后我们以该函数作为脚本调用,成功解析找到了我们需要的所有信息的所在部分。但是把全部信息打印出来还是不够的,我们需要对其进行分类和获取,比如获取超链接,获取图片,文字等等,这里就涉及到了正则表达式的获取,即精准并分类获得我们想要的信息。

# 首先我们要为正则设定一个模板,以获取超链接为例:

# 我们再将该模板,到函数中用来匹配信息: 

# 我们通过该循环 获取到的‘item’,也就是信息,他们的类型都是Tag,需要转换成字符串

# 我们利用刚刚创建的模板,通过正则筛选出我们要的超链接信息,但是根据网页显示,每个电影在同一个div,class_=''条件下面可能有多条重复的内容,那么获取第一个就好了,同时这样也能展现的数据类型为字符串(因为find_all返回的是列表)

# 这样我们就获取了该网页的所有电影信息中的超链接,以此类推找到图片信息等

# 根据HTML中图片对应的内容,设定正则模板,其中re.S是指,在前面的模板中,.*正常来讲会过滤掉换行符,但是加上了该设定后,.*不会忽略这些内容。

# 同样的方式,获取到各个图片信息 

 

# 定义好全部正则模板

# 书写完毕整个爬取和解析内容的代码 

三. 保存数据

1.Excel保存数据

 

# 首先引入xlwt库,调用Workbook函数,按照utf-8定义编码,创建了一个excel

# add_sheet,给excel加一个sheet

# 在sheet中编辑内容,第一个0是横坐标,第二个0是纵坐标,第三个是编写的内容

# save,创建并保存,就可以在project下找到该excel文件

例题:九九乘法写入excel

那么按照这样的方法,将我们爬出来并解析的数据依次写入就可以了:

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到