从 Web 中抓取信息
重复别人所说的话,只需要教育;而要挑战别人所说的话,则需要头脑。——玛丽·佩蒂博恩·普尔
利用 webbrowser 模块 访问页面
必须利用 webbrowser 模块 提供的函数 open(地址)
这样他就会自动帮你访问百度网址
import webbrowser
webbrowser.open("https://www.baidu.com/")
利用 request 模块从 web 下载文件
- request 模块让你很容易从 Web 上下载文件,不必担心链接问题等等。request 必须安装
安装
pip install requests
使用 requests 模块
import requests
使用 requests() 函数下载一个网页
- 成功 res.status_code
import requests
res = requests.get('https://jsopy.gitee.io/medias/banner/1.jpg')
# if (res.status_code == requests.codes.ok):
# print("对了")
print(type(res))
print(res.status_code) # 状态码 请求成功就是200 失败就是404
- 失败的时候最稳妥的是调用 raise_for_status()这样就会抛出异常,不会让程序崩溃
import requests
res = requests.get('https://jsopy.gitee.io/medias/banner3/1.jpg')
try:
res.raise_for_status()
print(res.status_code)
except:
print("没有请求到")
将下载的文件保存到硬盘
- 需要利用 with open 必须是 wb 形式 和 requests 模块 和 res.iter_content
import requests
res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')
try:
res.raise_for_status()
with open("./downland.txt", 'wb') as item:
for chunk in res.iter_content(100000):
item.write(chunk)
except:
print("没有请求到")
# 结果就是请求到文件 存到downland.txt里面
用 BeautifulSoup 模块解析 HTML
BeautifulSoup 安装
pip install beautifulsoup4
从 HTML 创建一个 BeautifulSoup 对象
- 从网页中
import requests
import bs4
res = requests.get('https://www.17cry.com/')
try:
res.raise_for_status()
example = bs4.BeautifulSoup(res.text) # BeautifulSoup 对象
print(type(example))
except:
print("没有请求到")
# 结果 <class 'bs4.BeautifulSoup'>
- 也可以从文件中
import requests
import bs4
try:
with open('./index.html', 'r', encoding='utf-8') as item:
result = bs4.BeautifulSoup(item)
print(result)
except:
print("没有请求到")
用 select 方法寻找元素
import requests
import bs4
res = requests.get('https://www.17cry.com/')
try:
res.raise_for_status()
example = bs4.BeautifulSoup(res.text) # BeautifulSoup 对象
result = example.select('ul') # 找到ul元素
print(result)
except:
print("没有请求到")
# 结果 找到ul的元素
- 选择器属性类似 css 选择器
选择器 | 匹配 |
---|---|
soup.select(‘div’) | 找到名为 div 的元素 |
soup.select(‘#haha’) | 找到 id 是 haha 的元素 |
soup.select(‘.haha’) | 找到类是 haha 的元素 |
soup.select(‘div span’) | 找到所在 div 元素之内的的 span 元素 |
soup.select(‘div>span’) | 找到直接在 div 元素之内的 span 元素,中间没有其他的元素 |
- 这个时候你想要获取到的是中国字就需要转码实现
import requests
import bs4
res = requests.get('https://www.17cry.com/')
try:
res.raise_for_status()
res.encoding = "utf8" # 或者gb18030
example = bs4.BeautifulSoup(
res.text) # BeautifulSoup 对象
result = example.select('li') # 找到a元素
print(result)
print(result[0].getText()) # 获取到内容
except:
print("没有请求到")
# 结果
# [<li>后续敬请期待</li>, <li><a href="http://www.beian.miit.gov.cn" style="width:100%;height:100%;display:block;" target="_blank">网站备案号:津ICP备15001525号</a></li>]
# 后续敬请期待
输出元素的属性
get(属性)
attrs 全部属性
import requests
import bs4
res = requests.get('https://www.17cry.com/')
try:
res.raise_for_status()
res.encoding = "utf8" # 或者gb18030
example = bs4.BeautifulSoup(
res.text) # BeautifulSoup 对象
result = example.select('a') # 找到a元素
print(result[0].get('style'))
print(result[0].attrs)
except:
print("没有请求到")
# 结果
# width:100%;height:100%;display:block;
# {'href': 'http://www.beian.miit.gov.cn', 'target': '_blank', 'style': 'width:100%;height:100%;display:block;'}
下载网页上所有图片
import requests
import bs4
import os
url = 'https://jsopy.gitee.io/'
res = requests.get(url)
try:
res.raise_for_status()
res.encoding = 'utf8'
result = bs4.BeautifulSoup(res.text)
result_img = result.select("img") # 获取到页面上所有图片的地址
os.makedirs('img')
for content in result_img:
imgurl = content.get('src') # 获取到单个图片的地址
name = os.path.basename(imgurl) # 只返回文件的最后名字 例如logo2.png
print(imgurl)
result_img_item = requests.get(url + imgurl) # 获取到图片信息
with open('./img/' + name, 'wb') as item:
for chunk in result_img_item:
item.write(chunk)
print("over")
except:
print("没有请求到")