Python爬取CSDN博客

      当时学习Python的主要原因,就是为了学习爬虫,从网上爬取自己想要的内容。Python作为一种脚本语言,学习起来方便简单,而且语言格式简练,很多C++,java要写很长的程序,用Python也许几行就搞定了。这篇就来说说用Python编写爬虫的过程。其实用其他语言也可以写爬虫,只不过用Python非常简单。

    1.最简单的爬虫

    新建一个python脚本,命名为csdn.py。先来编写个最简单的爬虫,就是爬取一个网页的内容。打开一个网站,用python获得该网站返回的响应,即html源码。(这个源码用浏览器打开就是我们获得的网页内容)

import urllib2
result=urllib2.urlopen("http://www.baidu.com/")
html=result.read()
print html
程序非常简单:第一行导入模块urllib2,该模块用于web方面的开发。第二行用该模块里的urlopen函数打开“百度”主页。第三行把第二步返回的内容赋值给html变量。最后就是print输出结果。我们来看看返回的结果
<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=Edge"><meta content="always" name="referrer"><link rel="dns-prefetch" href="//s1.bdstatic.com"/><link rel="dns-prefetch" href="//t1.baidu.com"/><link rel="dns-prefetch" href="//t2.baidu.com"/><link rel="dns-prefetch" href="//t3.baidu.com"/><link rel="dns-prefetch" href="//t10.baidu.com"/><link rel="dns-prefetch" href="//t11.baidu.com"/><link rel="dns-prefetch" href="//t12.baidu.com"/><link rel="dns-prefetch" href="//b1.bdstatic.com"/><title>百度一下,你就知道</title>

。。。其实就是HTML源码,代码太多直贴了前面一部分。这就是一次最简单的爬虫


    2.最简单的爬虫爬取csdn博客
    我们就用上面最简单的爬虫来爬虫CSDN博客的内容。将urlopen()里面的网址换为我的csdn其中一篇文章的地址“http://blog.csdn.net/u013080921/article/details/44134017”。运行,发现出错,结果显示如下:

Traceback (most recent call last):
  File "<pyshell#20>", line 1, in <module>
    execfile("csdn.py")
  File "csdn.py", line 12, in <module>
    result=urllib2.urlopen("http://blog.csdn.net/u013080921/article/details/44134017")
  File "C:\Python27\lib\urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "C:\Python27\lib\urllib2.py", line 410, in open
    response = meth(req, response)
  File "C:\Python27\lib\urllib2.py", line 523, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python27\lib\urllib2.py", line 448, in error
    return self._call_chain(*args)
  File "C:\Python27\lib\urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "C:\Python27\lib\urllib2.py", line 531, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
HTTPError: HTTP Error 403: Forbidden
其实就是403错误,被禁止访问。为什么呢?因为很多网站是禁止机器来访问的,机器也就是程序访问网站和人访问网站是有区别的。这里涉及到http协议。人上网用浏览器访问的时候,除了请求行,后面的首部包含了很多的信息。比如,我用火狐浏览器访问网站,使用Firebug查看亲求内容如下图


上图很多内容,再用程序爬取时是没有的,网站因此认为你不是认为浏览,将你的访问禁止。既然这样,我们就来模拟人为访问网站的过程。而Python也提供了相应的类来处理。


3.模仿浏览器爬取csdn博客

     将程序改为如下:

import urllib2

opener=urllib2.build_opener()
user_agent="Mozilla/5.0 (Windows NT 6.1; rv:36.0) Gecko/20100101 Firefox/36.0"
headers={'User-Agent':user_agent}
req=urllib2.Request("http://blog.csdn.net/happylee6688/article/details/43953671",headers=headers)
result=opener.open(req)
html=result.read()

print html
因为要模仿浏览器,需要使用build_opener函数,这是个高级函数,可以添加许多高级功能,如验证,cookie,代理等。这里只是添加了一个请求首部中的“User-Agent”对象,只是上图的值“Mozilla/5.0 (Windows NT 6.1; rv:36.0) Gecko/20100101 Firefox/36.0”,有火狐浏览器的版本。再来执行给程序,结果如下:

说明我们获取了csdn博客的html源码。下面就是要提取我们需要的内容,这里要用到一个很重要的概念---正则表达式。


3.根据HTML源码提取内容

   这里你需要知道正则表达式的基本知识,同时需要会分析源码。火狐浏览器的用户可以使用Firebug来查看源码,IE的按下F12查看源码。对于文章标题的源码如下

<span class="link_title"><a href="/u013080921/article/details/42582267">
        Java多线程---Lock类
        </a></span>
那么标题的匹配如下:

title=re.search(' <span class="link_title"><a .*?>(.*?)</a>',html,re.S)
re为正则表达式模块。获取为
print title.group(1)
输出就是:   Java 加解密技术系列之 MD5 。文章的题目。提取内容也是一样,不过提取的内容中有很多HTML标签,需要去除。完整代码如下:

# -*- coding: utf-8 -*- 
import urllib2
import urllib
import re
opener=urllib2.build_opener()
user_agent="Mozilla/5.0 (Windows NT 6.1; rv:36.0) Gecko/20100101 Firefox/36.0"
headers={'User-Agent':user_agent}
req=urllib2.Request("http://blog.csdn.net/happylee6688/article/details/43953671",headers=headers)
result=opener.open(req)
html=result.read().decode("utf-8")  
html.encode("utf-8")
#搜索文章题目
title=re.search(' <span class="link_title"><a .*?>(.*?)</a>',html,re.S)
#打印文章题目
print title.group(1)

content=re.findall('<div style=".*?">(.*?)</div>',html,re.S)
reg=re.compile('<[^>]*>')   #去除多余的html标签,只留下内容
for con in content:
	s=reg.sub('',con)
	print s,  #打印内容
	
结果如下图 :

到这里基本的爬虫内容就写完了。

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