Python3网络爬虫基本操作(二):静态网页抓取

一.前言

Python版本:Python3.X
运行环境:Windows
IDE:PyCharm

经过上一篇博客,相信大家对爬虫有一定认识了,这一篇我们系统的来讲解一下如何抓取静态网页资源。(我也是初学爬虫不久,我只是将学到的知识总结一下,分享给大家,如果有错请大家指出,谢谢!)

二.静态网页抓取

1.安装Requests库

打开cmd,键入:(详细安装教程,请参考上一篇博客)

pip install requests

2.获取网页相应内容

在Requests中,常用功能就是获取某个网页的内容。现在我们还是以豆瓣(https://movie.douban.com/chart)来举例。

import requests

link = "https://movie.douban.com/chart"
headers = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'
}
req = requests.get(link, headers=headers)
print("响应状态码:", req.status_code)
print("文本编码:", req.encoding)
print("响应体:", req.text)

这样就返回了一个叫req的response响应对象,我们可以从中获取想要的信息。上述代码结果如图:
在这里插入图片描述
(1)req.status_code 用于检测响应状态码。
(所有状态码详情:https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/5053660?fr=aladdin)
在这里插入图片描述
(2)req.encoding 是服务器内容使用的文本编码格式。
(3)req.text 是服务器响应内容。
(4)req.json() 是Requests中内置的JSON解码器。

3.定制Requests

(1)Get请求

有时为了请求特定数据时,我们往往需要在 URL 中加入某些数据。在构件 URL 时,我们通常将数据跟在一个问号后面,并以键/值的形式放入 URL 中,例如 https://movie.douban.com/top250?start=0。(这里就是将start=0传递到https://movie.douban.com/top250)

在Requests中,你可以直接把参数放到字典中,用params构建到URL中。
例如:

import requests
key = {'start': '0'}
req = requests.get('https://movie.douban.com/top250', params=key)
print("URL正确编码", req.url)

运行结果:
在这里插入图片描述

(2)定制请求头

请求头Headers提供了关于请求、响应或发送其他实体的信息。对于爬虫而言,请求头十分重要。如果没有指定的请求头或请求头和实际网页不一样,就可能无法获得正确的结果。我们要如何才能获取到网页的请求头呢?

我们以(https://movie.douban.com/top250?start=0)为例,进入网页检查页面,下图中箭头所指的部分就是该网页的请求头部分(Requests Headers)
在这里插入图片描述
提取其中的重要部分,可写出代码:

import requests

link = "https://movie.douban.com/top250?start=0"
headers = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36',
    'Host':'movie.douban.com'
}
req = requests.get(link, headers=headers)
print("响应状态码:", req.status_code)

(3)超时

有时候爬虫会遇见服务器长时间不返回,这时程序就会一直等待,使得程序没有顺利执行。因此,可以用 Requests 在 timeout 参数设定等待秒数结束之后停止等待响应。(我们一般把这个值设置为20秒)

在这我们把秒数设置为0.0001秒,以此来查看会抛出什么异常:

import requests

link = "https://movie.douban.com/top250?start=0"
headers = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36',
    'Host':'movie.douban.com'
}
req = requests.get(link, headers=headers, timeout=0.0001)
print("响应状态码:", req.status_code)

运行结果:
在这里插入图片描述

三.项目实践

我们以 https://www.qidian.com/rank/yuepiao 为例,来进行实践,目的是获取起点中文网中月票榜的一百本书的名称。

1.网站分析

打开起点中文网月票榜的网页,使用“检查”查看网页的请求头,编写好我们的请求头。
在这里插入图片描述
请求头:

headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36',
        'Host': 'www.qidian.com'
    }

第一页只有20本书的信息,如果想要获取所有100本书的信息,就需要获取总共5页的内容。

我们通过单击下一页发现网址从(https://www.qidian.com/rank/yuepiao?style=1&page=1)变成了(https://www.qidian.com/rank/yuepiao?style=1&page=2)。

这样就很容易理解了,每多一页,就给网页地址的page参数加上1。

然后我们通过上一篇博客所提到的方法,找到书籍的标题信息所在的div标签
在这里插入图片描述

2.信息获取

可以发现,每一本书的标题都在class='book-mid-info’的div标签下的a标签中,由此我们可以写出代码:

import requests
from bs4 import BeautifulSoup

def get_novel():
    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36',
        'Host': 'www.qidian.com'
    }
    novel_list = []
    for i in range(1,6):
        url= 'https://www.qidian.com/rank/yuepiao?style=1&page=' + str(i)
        req = requests.get(url, headers=headers, timeout= 20)
        bs = BeautifulSoup(req.text, 'html.parser')
        list = bs.find_all('div', class_='book-mid-info')
        for each in list:
            novel = each.h4.a.text.strip()
            novel_list.append(novel)
    return novel_list

lists = get_novel()
print (lists)

运行结果:
在这里插入图片描述

3.储存数据

我们获取到信息后,可以将信息保存到txt文本中。

import requests
from bs4 import BeautifulSoup

def get_novel():
    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36',
        'Host': 'www.qidian.com'
    }
    novel_list = []
    for i in range(1,6):
        url= 'https://www.qidian.com/rank/yuepiao?style=1&page=' + str(i)
        req = requests.get(url, headers=headers, timeout= 20)
        bs = BeautifulSoup(req.text, 'html.parser')
        list = bs.find_all('div', class_='book-mid-info')
        for each in list:
            novel = each.h4.a.text.strip()
            novel_list.append(novel)
            with open('lists.txt', "a", encoding='utf-8') as f:
                f.write(novel)
                f.write('\n')
                f.close()
    return novel_list

lists = get_novel()
print (lists)

运行结果:
在这里插入图片描述

这样我们就获取到这100本书籍的标题信息了。

©️2020 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值