Python网页内容获取笔记(一)

本文介绍了Python网络爬虫的基础,包括Requests库的使用,如GET、POST请求,处理异常,以及网络安全性问题。还讲解了BeautifulSoup库在解析HTML页面中的应用,如标签遍历和内容提取。示例涵盖了商品页面爬取、关键词搜索及图片下载。同时讨论了伪装浏览器请求以应对网页限制,并强调了遵循Robots协议和合理控制爬取速度的重要性。
摘要由CSDN通过智能技术生成

使用Python获取网页数据

爬虫可以理解为在一定规则要求下批量获取互联网特定页面的特定内容的技术手段,根据爬取频率和爬取数量的需求差异,爬虫也分为轻量级、中大规模和系统规模型的爬虫框架。本文档主要围绕爬虫入门阶段的轻量级和中等规模爬虫进行说明,涉及库主要包括requestes、BeautifulSoup、ReScrapy框架

目录

  • 基础知识
  • Requests库的使用
    • 爬虫的网络安全性问题
    • Requests爬取实例
  • BeautifulSoup库的使用
  • Re库的使用

基础知识

  • HTTP协议:Hypertext Transfer Protocol
    • 基于请求与响应模式的应用层协议
    • 采用URL作为网络资源定位标识
      • http://host[:port][path],host为主机名或IP地址,port为端口号,path为请求路径,一个URL对应一个数据资源
    • 常见操作方法:GET/HEAD/POST/PUT/PATCH/DELETE
      • POST在原有内容上附加,PUT覆盖原有资源,PATACH局部修改
  • HTML文件

Requests库的使用

  • 第三方库,需要进行安装。轻量级爬取网页必用库,操作要比urlib库更为简便,当前广泛使用的库。
  • Requests库通过发送请求,得到一个Response对象,进而从该对象上获取信息
  • Requests库常见的主要方法有7个,分别对应可在HTTP上进行的7种操作
    • requests.request():构造向网页的请求,是其他方法的基础
      • request.request(‘GET’/‘HEAD’/‘POST’…,‘url’,**kwargs)
    • requests.get():获取HTML网页最常用的方法
    • requests.head():获取网页头信息,头信息包含该网页编码方式、访问信息等
    • requests.post():向HTML网页提交POST请求
    • requests.put():向HTML网页提交PUT请求
    • requests.patch():向HTML网页提交局部修改请求
    • requests.delete():向HTML网页提交删除请求
    • 通常网页不允许普通访问者进行修改,因此主要方法集中在前三个
  • r = requests.get(url, params=None, **kwargs),get方法向制定url链接所在服务器提交请求,get()方法可以根据实际需求添加url额外参数或其他HTML网页控制的12个访问参数。返回response对象r包含服务器返回的全部爬取内容,常见属性有:
    • r.status_code:表示获取网页成功与否,200表示正常爬取,其他如404或403等表示爬取异常
    • r.headers返回对象头文件全部信息
    • r.encoding:根据头文件header信息判断的网页编码方式
    • r.apparent_encoding:根据网页内容判断的网页编码方式(备选编码方式)
    • r.text:url对应页面内容(有可能太多,初步预览时利用字符串切片一定长度)
    • r.content:响应内容二进制形式
  • 通用Requests库的使用框架(特别是考虑到异常情况下的处理)
    • 常见异常
      • requests.ConnectionError
      • requests.HTTPError
      • requests.URLRequired
      • requests.TooManyRedirects
      • requests.ConnectTimeout
      • requests.Timeout
    • 异常响应:r.raise_for_status(),当返回码不为200时产生HTTPError异常
      爬取单个网页常用框架:
import requests
try:
  r = requests.get(url,timeout=30)
  r.raise_status_code()
  r.encodint = r.apparent_encoding
  return r.text
except:
  return "产生异常"
网络爬虫的安全性问题
  • requests库:轻量级、数据量小且对爬取速度不敏感,应用90%以上网页
  • Scrapy库:中规模爬取,速度敏感,应用于爬取网站
  • 大规模,搜索引擎级别,速度要求高的需要定制
  • 对于隐私泄露、占用带宽资源、法律问题等需要关注
    • 根据网页头文件User-Agent和公告Robots协议进行判断
    • 一般仿照普通用户的访问频率和信息获取是可以允许的
Requests库网络爬取实例:

1.爬取购物网站商品页面

import requests
url = 'https://item.jd.com/100019549498.html' #联想小新pro14产品页面
try:
  r = requests.get(url)
  r.raise_for_status()
  r.encoding = r.apparent_encoding
  print(r.text[:1000])
except:
  print('爬取失败')

当爬取代码200但返回字符串出现错误时,有可能是网页限制了访问对象必须是以浏览器形式进行访问,而不是requests库对象,此时需要修改requests请求头文件”伪装“成浏览器

import requests
url = 'https://item.jd.com/100019549498.html' #联想小新pro14产品页面
try:
  user = {"user-agent":"Microsoft Edge/89.0.774.75"} #伪装浏览器访问
  r = requests.get(url,headers=user)
  r.raise_for_status()
  r.encoding = r.apparent_encoding
  print(r.text[:1000])
except:
  print('爬取失败')

2.给搜索页面提交自定义关键词

#利用parms获取某特定关键词的搜索信息
#利用源代码观察百度搜索引擎关键词url变化为”s+搜索关键字“
import requests
user = {"user-agent":"Microsoft Edge/89.0.774.75"}
keyword = "Python"
try:
    kv = {"wd":keyword}
    r = requests.get("https://www.baidu.com/s",params=kv)
    print(r.request.url) #显示实际搜索的链接
    r.raise_for_status()
    print(len(r.text))#搜索结果往往数据量很大,需要后续进行针对性获取
except:
    print("爬取失败")

3.网络图片爬取:获取图片内容,再以二进制形式写入到本地

import requests, os
url = 'https://pic1.zhimg.com/80v2-17a7d3c0ab72eb0084217efecd1bb7a9_720w.jpg' #目标图片链接
root = 'D://pics//'   #本地存储路径
path = root + url.split('/')[-1] #根据图片链接分割,保留最后一个字段作为图片名
try:
  if not os.path.exists(root):
    os.mkdir(root)    #本地文件夹不存在时直接创建
  if not os.path.exists(path):
    r = requests.get(url)
    r.raise_for_code()
    with open(path,'wb') as f:
      f.write(r.content)
      r.close()
      print('文件保存成功')
  else:
    print('文件已存在')
except:
  print('爬取失败')

BeautifulSoup库的使用

  1. 第三方库,需要外部安装,简称bs4库,用于解析HTML页面获取特定元素内容。常见调用方式为单独调用BeautifulSoup类,也可以直接调用库
from bs4 import BeautifulSoup
soup = BeautifulSoup('<p>data</p>','html.parser')
  1. BeautifulSoup库可以理解为将一个HTML网页根据自身标签进行解析、便利和维护的库,因为HTML语言自身的特点一个网页本质上就是一棵标签树,具有层次级别。
  2. 一个BeautifulSoup类代表一个HTML/XML的全部内容,看作一锅汤。要理解这锅汤就需要相应设定一个HTML页面的解析器,如html.parser就是bs4库自带HTML解析器。此外通过第三方安装lxml库和html5lib库也可以使用对应解析器。
  3. 标签的组成包括成对出现的名称,和标签自身携带的0个或多个属性

BeautifulSoup类的基本元素包括:

  • Tag:标签,基本信息单元,用<></> 表示开头结尾
  • Name:标签名,tag.name
  • Attributes:标签属性,以字典形式组织,调用tag.attrs
  • NavigableString:标签内非属性字符串,tag.string
  • Comment:标签内注释内容

使用BeautifulSoup类进行实例化获得对应Soup对象,可以获得HTML内容种任意标签及其附带内容如名称、属性和字符串等。

HTML文件的组织形式(基础)

为了便于对bs4库的使用,需要简单了解一下一个HTML的组织架构。作为根标签表明这是一个HTML文档,然后分开为head和body两个部分,其中head部分常见包括title,body部分作为网页主题内容包含了绝大多数文本、图像和超链接等内容,整体而言构成一个标签树。

对HTML标签的遍历可以通过上行、下行和平行三种遍历方式进行

  1. 下行遍历:
    1. .contents:子节点列表,存放目标标签全部子节点
    2. .children:用于循环遍历子节点
    3. .descendants:遍历所有子孙节点
for child in soup.body.children:
for child in soup.body.descendants:
  1. 上行遍历:
    1. .parent
    2. .parents:遍历所有先辈节点,包括soup自身
  2. 平行遍历
    1. .next_sibling:下一个平行节点标签
    2. .previous_sibling:上一个平行节点标签
    3. .next_siblings:所有平行节点标签
  • 基于bs4库的HTML格式输出:友好显示内容
    bs4库prettify()方法可以按照HTML标签树形式展示内容,可用于标签

  • bs4库将HTML输入转为utf-8编码,与python3.x一致,可以正常解析中文

bs4库的信息标记与提取方法
  • 信息标记的三种方法
    • XML:类似HTML形式,标签+属性+字符串+…,扩展性好但阅读体验不好,用于Internet信息交互
    • JSON:Javescript Object Notation,有类型的键值对,适合js语言,适合移动应用
    • YAML:无类型的键值对,阅读体检好,缩进表达所属关系,用于系统配置文件
  • 信息提取的一般方法
    • 完整解析所有标记然后提取:准确,但繁琐,速度慢
    • 直接搜索关键信息提取:方便,但准确程度与信息内容有关
    • 形式解析+搜索提取结合使用
# 获取目标HTML中所有链接,搜索链接标签<a>,然后提取其href属性中的链接地址
from bs4 import BeautifulSoup
soup = BeautifulSoup(HTML,'html.parser')
for link in soup.find_all('a'):
  print(link.get('href'))

.find_all(name,attrs,recursive,string,**kwargs)方法返回一个列表结果

  • name:标签名称的检索字符串
  • attrs:标签属性的检索字符串
  • recursive:默认True,检索所有子孙节点
  • string:字符串区域的检索

内容小结

本文主要记录一些自己学习Python爬取数据过程中的概念和相关知识,后续还会进行相应补充和完善。以当前的知识先进行静态网页的内容获取和整理,同时在后续的文章中逐步完善并进行说明。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值