抓取网页新闻(吐槽一下,人生不如意十有八九,希望现在的不如意是HTML )

优采云 发布时间: 2022-03-25 00:02

  抓取网页新闻(吐槽一下,人生不如意十有八九,希望现在的不如意是HTML

)

  今天花了一天时间用python抓取新浪门户的新闻。事实上,这并不难。关键是要卡在以下三个问题上。

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

  开始读取数据后,希望使用decode将读取的字符串转换为unicode字符串。显然,这是python处理杂乱字符串的常用套路。但是整个早上都有各种编码错误,认为返回的数据收录杂乱的字符。后来想起实习期间用别人的代码爬取网页内容,经过一个gzip的过程,才想起服务器返回的数据很有可能是gzip格式压缩的。

  所以当你收到服务器返回的数据时,可以判断“Content-Encoding”是否为'gzip'格式,如果是,则使用gzip解压;否则,您可以直接读取响应数据。请参阅下面的代码。

  #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')

  问题2:字符串编码问题

  一般来说,对于收录中文的网页,我们大多数人都会认为使用的是GB系列代码。主要有三种:GB2312、GBK和GB18030。从时间发展上看,GB2312 < GBK

  另外,在python中处理字符编码的时候,我们通常的套路是在读入的时候先把字符串解码成unicode,输出的时候再进行编码,这样可以保证所有unicode类型的字符串都在内存中处理。

  问题三:BeautifulSoup的使用

  BeautifulSoup 是一个方便高效的处理 HTML 或 XML 格式内容的包,只用到了一点点。可以参考 Beautiful Soup 的官方文档。

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

  使用bs4和urllib2爬取网页是个坑

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线