今天学到的东西都没有什么技术含量,但是又实在是累了,学不进去了。就写下来吧。
这里有个矛盾,我今天写的这篇文章涉及很多不相干的知识点,如果分成多篇文章,会有更大的可能性被搜索到;但是写成一篇更像是一天的总结,而且这些知识点拆开来都是可以谷歌到的。还是写成一篇吧。
今天做的事情是:只下载我想下载的东西。分析网页最出名的就是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:gting405@163.com