网络爬虫
其实就是按照一定规则自动抓取网页信息的程序或者脚本
url:相当于于文件目录,通过url找到相应的网页资源(文档、图像、视频等等)
爬虫最主要的处理对象就是URL,它根据URL地址取得所需要的文件内容,然后对它进行进一步的处理。
所谓网页抓取,就是指把URL地址中指定的网络资源从网络流中读取出来,保存到本地。类似于使用程序模拟浏览器的功能,把URL作为HTTP请求的内容发送到服务器端,然后读取服务器端的响应资源。
Requests入门
requests
库是一个第三方请求库,python自带的标准库urllib
库下的request
模块的相关方法也可以进行网页请求。
requests
7个主要方法介绍
方法 |
说明 |
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 |
- 最常用的方法:
requests.get()
和 requests.head()
import requests
r = requests.get("http://www.baidu.com")
print(r.status_code)
type(r)
r = requests.head("http://www.baidu.com")
r.header
r.text
属性 |
说明 |
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))
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()