美文网首页虫虫
python爬虫入门:requests and bs4

python爬虫入门:requests and bs4

作者: Jaye瓶子 | 来源:发表于2019-03-14 13:30 被阅读74次

网络爬虫

  • 其实就是按照一定规则自动抓取网页信息的程序或者脚本

  • url:相当于于文件目录,通过url找到相应的网页资源(文档、图像、视频等等)

  • 爬虫最主要的处理对象就是URL,它根据URL地址取得所需要的文件内容,然后对它进行进一步的处理。

  • 所谓网页抓取,就是指把URL地址中指定的网络资源从网络流中读取出来,保存到本地。类似于使用程序模拟浏览器的功能,把URL作为HTTP请求的内容发送到服务器端,然后读取服务器端的响应资源。

Requests入门

  • 首先要获取网页资源——通过requests库
  1. requests库是一个第三方请求库,python自带的标准库urllib库下的request模块的相关方法也可以进行网页请求。

  2. requests7个主要方法介绍

方法 说明
requests.request() 构造一个Request请求,作为以下方法的基础调用方法
requests.get() 获取网页的主要方法,对应于HTTP的GET
requests.head() 获取网页的请求头,对应于HTTP的HEAD
requests.post() 向HTML页面提交POST请求,对应于HTTP的POST
requests.put() 向HTML页面提交PUT请求,对应于HTTP的PUT
requests.delete 向HTML页面提交DELETE请求,对应于HTTP的DELETE
requests.patch() 向HTML页面提交局部修改请求,对应于HTTP的PATCH
  1. 最常用的方法:requests.get()requests.head()
  • requests.get()方法调用了requests.request(GET, url, \*\*kwargs)方法创建一个Request对象向服务器发送get请求,返回一个Response对象(也就是抓取到的网页)。

  • get()方法的使用

import requests
r = requests.get("http://www.baidu.com")
print(r.status_code)
type(r)
  • head()方法的使用
r = requests.head("http://www.baidu.com")
r.header
r.text
  • Response对象的属性
属性 说明
r.status_code HTTP请求的返回状态,200表示成果,404表示失败
r.text HTTP响应内容的字符串形式,即url对应的页面内容 、
r.encoding 从HTTP header中猜测的响应内容编码方式(如果header中不存在charset,默认为iso-8859-1)
r.apparent_encoding 从内容中分析出的响应内容编码方式
r.content HTTP响应内容的二进制格式
  • 一个简单的通用框架
def getHTMLText(url):
    try:
        # 伪装成浏览器访问
        kv = {'user-agent':'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36'}
        # get方法调用request方法,返回一个response对象,也就是目标网页
        r = requests.get(url,headers=kv)
        r.raise_for_status() #不是200就会引发异常
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "error"
if __name__ == "__main__":
    url = "https://www.baidu.com"
    print(getHTMLText(url))
  • 一个简单的demo:爬一张图片
import requests
import os
url = "https://static.boredpanda.com/blog/wp-content/uploads/2018/04/handicapped-cat-rexie-the-handicat-dasha-minaeva-60-5acb4f1d1cdbb__700.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)
        with open(path, 'wb') as f:
            f.write(r.content)
            f.close()
            print("文件保存成功")
    else:
        print("文件已存在")
except:
print("爬取失败")

数据解析: BeautifulSoup库

  • Beautiful Soup库是解析、遍历、维护“标签树”的功能库,对应HTML的框架(Requests库对应HTTP操作)
  • BeautifulSoup对应一个HTML/XMl文档的全部内容
from bs4 import BeautifulSoup
soup = BeautifulSoup("<html>data</html>","html.parser")
print(soup.prettify())
# soup2 = BeautifulSoup(open("D://demo.html"),"html.parser")
  • 解析网页内容需要相应的解析器,"html.parser"指定了相应的解析器,这里使用的的bs4的HTML解析器,只需要安装bs4库即可,还有一些解析器这里不做详细介绍。
基本元素 说明
Tag 标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾
Name 标签的名字,<h3>xxx</h3>的名字就是‘h3’,格式是<tag/>.name
Attributes 标签的属性,字典形式组织,格式:<tag>.attrs
NavigableString 标签内非属性字符串,<>xxx</>,格式:<tag>.string
Comment 标签内字符串注释部分

标签树的遍历

  • 下行遍历
属性 说明
.contents 子节点列表,将<tag>所有儿子节点存入列表
.children 子节点迭代类型,与.contents类似,用于循环遍历儿子节点
.descendants 子孙节点迭代类型,包含所有子孙节点,用于循环遍历
# 遍历儿子节点
for child in soup.body.children:
    print (child)
# 遍历子孙节点
for child in soup.body.descendants:
    print(child)
  • 上行遍历
属性 说明
.parent 节点的父亲标签
.parents 节点先辈标签的迭代类型,用于循环遍历先辈标签
# 查看title的父亲节点(发现是head标签)
soup.title.parent
# 查看html的父亲节点(因为他是文本的最高级标签,所以他的父亲就是他自己)
soup.html.parent
# 查看soup的父亲节点,soup是特殊的标签,他的父亲没有显示,说明是空的
soup.parent
# 上行代码(对a标签的所有先辈节点进行打印)
for parent in soup.a.parents:
    if parent is None: # 会遍历到soup,但是他没有先辈
        print(parent)
    else:
        print(parent.name)
  • 平行遍历
属性 说明
.next_sibling 返回按照HTML文本顺序的下一个平行节点标签
.previous_sibling 返回按照HTML文本顺序的上一个平行节点标签
.next_siblings 迭代类型,返回按照HTML文本顺序的后续所有平行节点标签
.previous_siblings 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签
  • 让HTML内容更友好的显示:prettify()方法,该方法在每一个标签后面加了个换行符
from bs4 import BeautifulSoup
soup = BeautifulSoup(demo,"html.parser")
soup.prettify()

相关文章

网友评论

    本文标题:python爬虫入门:requests and bs4

    本文链接:https://www.haomeiwen.com/subject/gpuqmqtx.html