本文最后更新于 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') #检索文本