欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-11 21:15:55
Python3网络爬虫基本操作(二):静态网页抓取一.前言二.静态网页抓取1.安装Requests库2.获取网页相应内容3.定制Requests(1)Get请求(2)定制请求头(3)超时三.项目实践1.网站分析2.信息获取3.储存数据一.前言Python版本:Python3.X运行环境:WindowsIDE:PyCharm经过上一篇博客,相信大家对爬虫有一定认识了,这一篇我们系统的来讲解一下如何抓取静态网页资源。(我也是初学爬虫不久,我只是将学到的知识总结一下,分享给大家,如果有错请大家指出,谢谢...

一.前言

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响应对象,我们可以从中获取想要的信息。上述代码结果如图:
荐
                                                        Python3网络爬虫基本操作(二):静态网页抓取
(1)req.status_code 用于检测响应状态码。
(所有状态码详情:https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/5053660?fr=aladdin)
荐
                                                        Python3网络爬虫基本操作(二):静态网页抓取
(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)

运行结果:
荐
                                                        Python3网络爬虫基本操作(二):静态网页抓取

(2)定制请求头

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

我们以(https://movie.douban.com/top250?start=0)为例,进入网页检查页面,下图中箭头所指的部分就是该网页的请求头部分(Requests Headers)
荐
                                                        Python3网络爬虫基本操作(二):静态网页抓取
提取其中的重要部分,可写出代码:

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)

运行结果:
荐
                                                        Python3网络爬虫基本操作(二):静态网页抓取

三.项目实践

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

1.网站分析

打开起点中文网月票榜的网页,使用“检查”查看网页的请求头,编写好我们的请求头。
荐
                                                        Python3网络爬虫基本操作(二):静态网页抓取
请求头:

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标签
荐
                                                        Python3网络爬虫基本操作(二):静态网页抓取

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)

运行结果:
荐
                                                        Python3网络爬虫基本操作(二):静态网页抓取

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)

运行结果:
荐
                                                        Python3网络爬虫基本操作(二):静态网页抓取

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

本文地址:https://blog.csdn.net/Xu__Hn/article/details/107636841

相关标签: python 网络爬虫