python爬虫入门:requests and bs4

网络爬虫

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

  • 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()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容