Lib of Requests & bs4
本文最后更新于 1843 天前,其中的信息可能已经有所发展或是发生改变。

Requests库

     创建一个requests类的实例化对象r, 并使用get方法访问url(“https://pintia.cn/”)

r = requests.get("https://pintia.cn/")

    以特定方式访问格式:

requests.request('method',url,**kwargs)
使用方法:
     r = requests.request('GET',url,**kwargs)
     **kwargs:(星星开头为可选参数,常用参数如下:)  sthdic == something dictionary需要字典作为参数

     params = sthdic = {key:value}-----将字典中字符串作为参数填到url中 *get方法
     data = sthdic ------字典,字符串作为参数作为Request的内容
     headers = sthdic -----定制头
     coolkies
     file

返回HTTP状态码

r.status_code

编码方式

r.encoding #根据服务器发送的信息判断编码,默认为ISO-啥啥
r.apparent_encoding #根据网页内容判断编码
#一劳永逸,恒根据网页内容判断编码
r.encoding = r.apparent_encoding

典型爬取案例

def getHTMLText(url):
	try:
		r = requests.get(url, timeout=30)
                r.raise_for_status() 
		#如果HTTP状态不是200 则引发HTTPError异常
                r.encoding = r.apparent_encoding
		r.encoding = 'UTF-8'
		return r.text
	except:
		return "error!"

#网络连接不一定稳定,需要捕获异常

定制头

headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) 
Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063'}
#以字典形式,使用
requests.get("https://pintia.cn/", headers = headers)

bs4库

    Requests 库用来获取网页信息

    而 BeautifulSoup4库是用来解析HTML文件的库,简称bs4。

     需要如此导入(从bs4库中导入BeautifulSoup类)

from bs4 import BeautifulSoup

BeautifulSoup类只能解析文本,因此需要requests库获取网页文本,下文假设 test_html变量 已包含一个网页内容

   解析该页面内容

soup = BeautifulSoup (test_html, 'html.parser')    # html.parser为bs的解析器

   获取标签(tag)内容

soup.tag #可以用来获取HTML页面的任一个标签
#如:
soup.title #可获取当前网页的标签名
#如果该有多个标签,soup.tag 返回第一个

  获取标签(tag)名字

soup.a.parent.name  #通常用于获取父类含有什么标签

  获取tag的属性(attrs)

soup.a.attrs #返回 a 标签尖括号里的内容,返回类型为字典

   获取tag的显示在网页中的文本内容

soup.a.string

标签树的下行遍历

for child in soup.body.children:
    print(child)    #遍历body标签的子标签

for child in soup.body.descendants:
​    print(child)   #遍历body标签所有的子孙标签(迭代遍历子标签)

标签树的上行遍历

.parent  #该标签的上一个父标签
.parents #该标签的所有迭代父辈标签,如果已是最上级标签,使用该方法时会返回 None


for parent in soup.a.parents:
​    if parent is None:
​        print(parent)
​    else
​        print(parent.name)

 

标签树的平行遍历

.next_sibling                  #返回按照HTML文本顺序的下一个平行节点标签
.previous_sibling              #返回按照HTML文本顺序的上一个平行节点标签
.next_siblings                 #迭代类型,返回按照HTML文本顺序的后续所有平行节点标签
.previous_siblings             #迭代类型,返回按照HTML文本顺序的前续所有平行节点标签

for sibling in soup.a.next_siblings:
​    print(sibling)       #所有后续标签
for sibling in soup.a.previous_siblings
​    print(sibling)       #所有前续标签

#平行遍历标签必须在同一父标签下

find_all()

tag(…) 等价于 tag.find_all(…)

soup(…) 等价于 soup.find_fall(…)

检索

soup.find_all('a')
soup.find_all(['a','b'])   #检索多个标签
soup.find_all(id='link1')  #检索id
soup.find_all(attrs = {"class":"course"})   #检索属性
soup.find_all(string = 'This is a sample')  #检索文本

 

上一篇
下一篇