使用requests和beautiful soup下载网页数据

栏目: Python · 发布时间: 7年前

内容简介:Python中有很多方便的包,requests和beautiful soup可以很简单将一个网站直接下载下来。requests是一个非常简单的http库,比urllib2要人性化很多。官网很贴心的,对比了用两个模块来做同一件的数据的代码量。4 VS 11 哪个更方便简洁,毋庸置疑。

Python中有很多方便的包,requests和beautiful soup可以很简单将一个网站直接下载下来。

Requests

requests是一个非常简单的http库,比urllib2要人性化很多。官网很贴心的,对比了用两个模块来做同一件的数据的代码量。

requests代码样例

import requests

r = requests.get('https://api.github.com', auth=('user', 'pass'))

print r.status_code
print r.headers['content-type']

urllib2代码样例

import urllib2

gh_url = 'https://api.github.com'

req = urllib2.Request(gh_url)

password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_manager.add_password(None, gh_url, 'user', 'pass')

auth_manager = urllib2.HTTPBasicAuthHandler(password_manager)
opener = urllib2.build_opener(auth_manager)

urllib2.install_opener(opener)

handler = urllib2.urlopen(req)

print handler.getcode()
print handler.headers.getheader('content-type')

4 VS 11 哪个更方便简洁,毋庸置疑。

安装requests

由于 python 3生态的成熟,需要库已经在官网上明确力挺python3,requests就是其中之一。

pip3 install requests

requests可以用来方便的下载网页并保存到本地。

beautiful soup

beautiful soup是用于解析HTML代码的python库,提供了很多便捷的方法来提取特定的HTML元素。

安装beautiful soup

beautiful soup有3和4两个版本,建议直接使用4版本。

pip install beautifulsoup4

在下载数据任务中,beautiful soup的角色主要是解析需要下载的url及img等资源。具体的下载的任务交给requests来进行。

动手下载

第一步需要有个起始的baseurl,从里面获取要下载的url里面。 第二步是下载每个页面,并且记录每个页面的img 第三部下载所有img

根据baseurl获取所有要下载的url

import requests
from bs4 import BeautifulSoup
BASE_URL = 'http://baseurl.com'
r = requests.get(BASE_URL)
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text)
urls = []
for link in soup.find_all('a'):
    urls.append(link.get('href'))
EXCLUDE = []
urls = [url for url in urls if url not in EXCLUDE]

需要注意一下页面的编码,如果编码不正确会出现乱码。

beautil soup会把html解析成类似嵌套的字典的结构。通过find_all方法可以找到所有特定html标签,通过get方法可以找到特定标签下的对应值。url是放入href属性中。

由于页面上的肯定存在某些url不是我们想要的,所以增加了一个排除的列表。

下载每个页面,并且记录所有img

imgs = []
for url in urls:
    r = requests.get(BASE_URL + url)
    # 下载HTML
    with open(url, 'wb') as fd:
        for chunk in r.iter_content(1024):
            fd.write(chunk)
    # 记录下图片
    soup = BeautifulSoup(r.text)
    for img in soup.find_all('img'):
        imgs.append(img.get('src'))

iter_content是将html转化为文件流写入文件。

find_all还是用来查找所有的img标签,所不同的是,img地址是放在src属性中。

这里需要注意的是,html中的地址很多的是相对地址,因此,真实的地址需要增加BASE_URL。

下载所有img

# 下载图片
for img in imgs:
    r = requests.get(BASE_URL + img)
    if r.status_code == 200:
        with open(img, 'wb') as f:
            for chunk in r.iter_content(1024):
                f.write(chunk)

将上面收集到img都下载下来。

这里需要注意一下,img通常都是放入特定目录中,因此,需要先创建对应的文件夹。

好了,找一个你感兴趣的网页试一下吧。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Python网络数据采集

Python网络数据采集

米切尔 (Ryan Mitchell) / 陶俊杰、陈小莉 / 人民邮电出版社 / 2016-3-1 / CNY 59.00

本书采用简洁强大的Python语言,介绍了网络数据采集,并为采集新式网络中的各种数据类型提供了全面的指导。第一部分重点介绍网络数据采集的基本原理:如何用Python从网络服务器请求信息,如何对服务器的响应进行基本处理,以及如何以自动化手段与网站进行交互。第二部分介绍如何用网络爬虫测试网站,自动化处理,以及如何通过更多的方式接入网络。一起来看看 《Python网络数据采集》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具