荐 Python3网络爬虫基本操作(二):静态网页抓取
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本书籍的标题信息了。
本文地址:https://blog.csdn.net/Xu__Hn/article/details/107636841
上一篇: Java之JSTL的基础运用