从 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("没有请求到")
 
                        
                        