使用bs4和urllib2抓取网页,都是坑


今天折腾了一天使用python抓取新浪门户上的新闻,其实难倒是不难,关键就是在下面三个问题上卡住了。

问题一:新浪新闻返回gzip格式的数据

一开始read data之后,希望使用decode将读取到的字符串转化为unicode字符串,显然这是python处理乱七八糟字符串的常用套路。但是一上午都在各种encode error,以为是返回的数据中包含了乱七八糟的字符导致的。后来想起来自己在实习的时候用过别人的代码抓取网页内容,经过了一个gzip的过程,于是才想起来很有可能是服务器返回的数据使用gzip格式进行压缩。

于是当你接收到服务器返回的数据后,你判断一下”Content-Encoding”是否为’gzip’格式,如果是的话就要用gzip进行解压;否则的话则直接读取response的数据即可。可以参见下面的代码。

#coding=utf8
import urllib2
from StringIO import StringIO
from bs4 import BeautifulSoup
import gzip

def loadData(url):
    request = urllib2.Request(url)
    request.add_header('Accept-encoding', 'gzip')
    response = urllib2.urlopen(request)
    print response.info().get('Content-Encoding')
    if response.info().get('Content-Encoding') == 'gzip':
        print 'response data is in gzip format.'
        buf = StringIO(response.read())
        f = gzip.GzipFile(fileobj=buf)
        data = f.read()
    else:
        data = response.read()
    return data
    
if __name__ == '__main__':
    page = loadData('http://news.sina.com.cn/')
    soup = BeautifulSoup(page, from_encoding='GB18030')
    print soup.prettify().encode('GB18030')

问题二:字符串编码问题

通常来说包含中文的网页,我们大都可以认为采用了GB系列的编码,其主要有三种分别是GB2312、GBK和GB18030三种,从时间发展先后来说GB2312 < GBK <GB18030,通常来说包含的字符的个数也是这个关系。如果说在使用GB2312时用到了属于GBK中的字符,那么我们可以在创建BeautifulSoup的时候指定from_encoding=’GBK’,当然由于GB18030中可编码的字符最多,可以不管网页使用的是GB2312或者是GBK编码,都可以一律在构造BeautifulSoup的时候指定from_encoding=’GB18030’。

另外在python中处理字符编码的时候,我们通常的套路是读入的时候要先将字符串decode到unicode,输出的时候我们进行encode,这样保证在内存中处理的都是unicode类型的字符串。

 

问题三:BeautifulSoup的使用

BeautifulSoup是方便高效的处理HTML或XML格式的内容的package,具体只会用一点点。可以参考Beautiful Soup的官方文档http://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html


吐槽一下,人生不如意十有八九,希望现在的不如意是为以后的生活攒人品吧。


### 回答1: urllib 和 Beautiful Soup (bs4) 是 Python 中常用的网络爬虫urllib 用于发送 HTTP 请求并接收响应,可以用来抓取网页内容。 Beautiful Soup 用于解析 HTML 或 XML 文档,可以帮助你从网页中提取有用的信息。 urllib 和 Beautiful Soup 的工作流程大致如下: 1. 使用 urllib 发送 HTTP 请求并接收响应。 2. 使用 Beautiful Soup 解析响应内容,提取有用的信息。 3. 根据需要,对获取的信息进行进一步处理。 urllib 和 Beautiful Soup 的优点是: - 简单易用:urllib 和 Beautiful Soup 提供了丰富的 API,使得网络爬虫的开发变得更加容易。 - 功能强大:urllib 和 Beautiful Soup 支持多种不同的 HTTP 请求方法,可以通过自定义 HTTP 头来模拟浏览器访问,并支持多种解析器,可以解析 HTML 和 XML 文档。 urllib 和 Beautiful Soup 的缺点是: - 运行速度较慢:urllib 和 Beautiful Soup 的运行速度相对较慢,对于大规模的网络爬虫,可能会影响效率。 - 不能处理 JavaScript:urllib 和 Beautiful Soup 只能处理静态的 HTML 或 XML 文档,对于那些使用 JavaScript 动态生成的网页,无法处理。 ### 回答2: urllib和beautifulsoup(bs4)是两个经常被用于网络爬虫的Pythonurllib是一个用于处理网络请求的,它提供了打开URL、发送HTTP请求、处理响应等功能。而beautifulsoup是一个用于解析HTML和XML文档的,它可以从HTML页面中提取出需要的信息。 urllib的工作流程如下:首先,我们使用urllib的请求方法打开并读取URL地址,获取到对应的HTML页面内容。接下来,将这个内容传给beautifulsoup进行解析。利用beautifulsoup,我们可以通过选择器(CSS选择器或Xpath表达式)来定位和提取出我们需要的标签或元素,或者找到页面中的特定文本。 urllib和beautifulsoup的优点是: 1. 简单易用:它们都是Python标准中的模块,不需额外安装即可使用使用方法也相对简单。 2. 功能强大:urllib可以方便地发送HTTP请求、处理响应和获取页面内容,而beautifulsoup则提供了强大的解析和搜索功能,可以高效地从HTML或XML中提取信息。 3. 广泛支持:urllib支持各种HTTP请求方法(GET、POST等),并且兼容不同的Python版本。beautifulsoup则支持解析多种类型的文档,包括HTML、XML等。 4. 开源免费:它们都是开源免费的软件,可以根据自己的需求进行调整和修改。 然而,它们也存在一些缺点: 1. 执行效率有限:在大规模爬取数据时,urllib运行速度可能较慢,因为它的功能相对简单,不能进行高级的并发处理。 2. 需要编写较多代码:使用这两个需要编写一些代码来发送请求、处理响应和解析页面,对于不熟悉Python的开发者来说可能需要一定的学习成本。 3. 对于一些特殊情况的处理有限:urllib和beautifulsoup虽然功能强大,但对于一些特殊的网页结构或反爬虫机制的处理可能有一定限制,需要开发者根据具体情况进行处理。 综上所述,urllib和beautifulsoup是实现网络爬虫功能的两个重要工具,它们的简单易用和功能强大使得它们在爬取数据和解析网页时广受开发者青睐,并被用于各种数据挖掘和分析的应用场景。 ### 回答3: urllibbs4Python中用于处理URL和解析HTML的两个常用urllib主要用于打开URL和进行网页内容读取。其工作流程大致如下: 1. 导入urllib和相关模块。 2. 使用urllib的urlopen方法打开URL链接,获取一个HTTPResponse对象。 3. 通过HTTPResponse对象的read方法读取网页内容,并使用decode方法解码为字符串。 4. 对获取到的网页内容进行进一步处理,比如解析HTML标签、提取数据等。 bs4是基于HTML解析器(如lxml、html5lib等)的Python包,用于从HTML文档中提取数据。其工作流程大致如下: 1. 导入bs4和相关模块。 2. 使用bs4的BeautifulSoup类和指定的HTML解析器创建一个BeautifulSoup对象。 3. 使用BeautifulSoup对象对HTML文档进行解析,提取需要的数据。 4. 进行数据的处理和操作,如提取特定标签、查找特定内容、遍历等操作。 这两个的优点和缺点如下: urllib的优点: 1. 自带的模块,不需要额外安装。 2. 功能比较简单,适用于简单的URL读取和内容获取。 urllib的缺点: 1. 功能相对较少,不能方便地进行HTML解析和提取数据。 2. 对于复杂的URL读取、请求和处理,需要编写较多的代码。 bs4的优点: 1. 可以方便地进行HTML解析和提取数据,提供了一系列灵活的方法。 2. 支持多种HTML解析器,可以根据需要选择合适的解析器。 bs4的缺点: 1. 需要额外安装,可能会增加项目的依赖。 2. 对于简单的URL读取和内容获取,bs4可能显得过于复杂,不是最好的选择。 综上所述,urllib适用于简单的URL读取和内容获取,而bs4适用于复杂的HTML解析和数据提取。根据实际需求,我们可以选择合适的来完成相应的任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值