手工分析网页内容

今天学到的东西都没有什么技术含量,但是又实在是累了,学不进去了。就写下来吧。

这里有个矛盾,我今天写的这篇文章涉及很多不相干的知识点,如果分成多篇文章,会有更大的可能性被搜索到;但是写成一篇更像是一天的总结,而且这些知识点拆开来都是可以谷歌到的。还是写成一篇吧。

今天做的事情是:只下载我想下载的东西。分析网页最出名的就是beautifulsoup,但是我想用用笨办法,正好了解一下网页组成。

简单介绍一下下载网页。首先就是向网页发送请求。这个我正在钻研,普通的就是发送个请求,python默认的请求是带着python头(headers)的。这样的会被大部分服务器拒绝,我们简单的伪装一下就好。

headers = {
        "headers" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36"
    }

这个基本就可以伪装成主流浏览器。也可以伪装成windows系统,网上一查便知。向网站发送请求:

response = requests.get(url, headers = headers)

url就是你想要下载的网页。我这里选择的是cnbeta,因为它基本不会拒绝爬虫的请求。csdn相对来说就保护有点过头了,我把原味链接放到微信公共账号里,然后在微信里点击的时候,就相当于是微信的服务器向csdn发送请求,csdn竟然直接就拒绝了。在我这边看来,就是网址不存在。

再高级一点可以加入自己的cookie,这样就相当于自己登录了。改天写个教程专门写这个。

网页就保存在response里,想要查看网页内容的话可以:

print response.text
注意看是没有()的哦。因为不是method。现在我们就可以开始分析了。

先转换成html对象

parsed_body = html.fromstring(response.text)
这样这个对象有个xpath的method,就是我们分析网页的杀器了。有关xpath的教程建议搜索w3c,很简单,就5页。

比如这个网页:http://www.cnbeta.com/articles/329197.htm,我在源代码中找到标题

<section class="main_content">
    <section class="main_content_left">
        <article class="cb_box article">
            <div class="body">
                <header>
                    <h2 id="news_title">创新发布声霸锣蓝牙音箱 2.1声道带NFC是亮点</h2>
                    <a alt="432" id="sign"></a>
尽量找到其与众不同的地方,感觉id就是个好的切入点。于是搜索了一下,h2的id是独一无二的:

article_title = parsed_body.xpath('//h2[@id="news_title"]/text()')
//指的是目前的标签,这个例子中我们要的就是h2,[ ]是该标签的性质,我们抓的是id,@是性质的修饰,标明后面是它的性质。text()是该标签的内容,注意没有@,因为不是它的性质。

比如我要下载下面标签的超链接:

<span class="where">
                            稿源:<a href="http://digi.tech.qq.com/">腾讯数码</a></span>
其实就是下载span下面的a的href性质

from_url = parsed_body.xpath('//span[@class="where"]/a/@href')
末尾的性质或者文档或者标签本身就是我们要取出的内容。

内容也是一样的方法。

本来事情就算是结束了,没想到遇到了讨人厌的汉字编码问题。如果print article_title,你会发现会输出:

[u'\xe5\xbd\xad\xe5\x8d\x9a\xef\xbc\x9a\xe9\x98\xbf\xe9\x87\x8cIPO\xe5\x8a\xbf\xe5\xa4\xb4\xe5\xbc\xba \xe5\x85\xb3\xe8\x81\x94\xe8\x82\xa1\xe5\x8f\x97\xe7\x9b\x8a\xe8\x82\xa1\xe4\xbb\xb7\xe4\xb8\x8a\xe6\xb6\xa8']
首先这是个字符串,但是即使把其中的内容取出来打印,也依然是这样的内容,网页的编码是utf-8,这看起来也是utf-8。如果把u去掉,把其余的复制出来输出的话,会得到:
彭博:阿里IPO势头强 关联股受益股价上涨
就没问题了。这个u用来修饰字符串,是把字符串内的内容翻译成unicode,而这些字符串本来就是unicode,因此就出错了。

网上提供的解决办法如下:

title = article_title[0].encode('raw_unicode_escape')
这下就可以尽情的下载啦。

源代码:https://github.com/gt11799/cnbeta_crawler

——————————————

github主页:https://github.com/gt11799

E-mail:[email protected]










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章