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

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

内容简介: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通常都是放入特定目录中,因此,需要先创建对应的文件夹。

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


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

查看所有标签

猜你喜欢:

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

算法基础

算法基础

[美] 托马斯 H.科尔曼(Thomas H.Cormen) / 王宏志 / 机械工业出版社 / 2015-12 / 59.00

本书介绍了什么是计算机算法,如何描述它们,以及如何来评估它们。这些计算机算法将提供:利用计算机搜索信息的简单方式;解决各种排序问题的方法;利用有向无环图和最短路径法来解决基本问题的方法(可用于建模公路网络,任务间的依赖及金融关系);解决字符串(例如DNA结构)问题的方法;密码学背后的基本原理;数据压缩的基础知识;以及甚至一些没有人能够理解如何在计算机上用相当长的时间来解决的问题。 本书适合作......一起来看看 《算法基础》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

MD5 加密
MD5 加密

MD5 加密工具