抓取网页新闻(吐槽一下,人生不如意十有八九,希望现在的不如意是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爬取网页是个坑