python网页抓取
                 jopen
                 12年前
            
                    python自带了urllib和urllib2模块,以及第三方的requests库来抓取网页,这里我们使用easy_install包管理工具下载 requests库,BeautifulSoup库,在CMD命令行下,切换到easy_install的目录,运行命令easy_install 包名称。
easy_install requests
安装好requests包之后,我们就可以选择使用urllib,urllib2或requests库来抓取网页了
1.网页内容的抓取
#! /usr/bin/env python #coding:utf-8 import urllib import urllib2 import requests import sys url = 'http://www.csdn.net' def urllib2Test(): req = urllib2.Request(url) response = urllib2.urlopen(req) thePage = response.read() def requestsTest(): r = requests.get(url) r.status_code r.content r.headers def urllib2TestEx(url): req = urllib2.Request(url) try: response = urllib2.urlopen(req) content = response.read() except urllib2.URLError,e: print e.reason def urlhttperror(url): req = urllib2.Request(url) try:urllib2.urlopen(req) except urllib2.HTTPError,e: print e.read() if __name__ == '__main__': urllib2Test() requestsTest() urllib2TestEx(url) urlhttperror(url)
2.爬虫伪装成浏览器的访问
在访问一些网站时,会出现HTTPError: HTTP Error 403: Forbidden这样的异常,这是由于现在有些网站禁止爬虫访问,爬虫会带来服务器上的负担,爬虫和浏览器发出的http请求区别在于:当用户发送一个http请求的时候,浏览的的版本信息也包含在了http请求信息中,而爬虫就不包含头信息,当服务器端收到一个页面访问请求时,如果不知道发送这个请求使用的浏览器,操作系统,硬件平台等信息,这些信息在HTTP协议的中的一个字段User-agent中,缺失这些信息,服务器会认为这些请求是非正常的访问,我们用 Fiddler工具就可以看到浏览器的请求的信息.
  
对于禁止爬虫的网站,可以伪装成浏览器访问,在请求中加入UserAgent的信息。
  添加和修改
  headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
  req = urllib2.Request("http://blog.csdn.net/nevasun", headers=headers)
  伪装成浏览器访问如下
  #! /usr/bin/env python    #coding:utf-8        import requests    from BeautifulSoup import BeautifulSoup    from os.path import dirname, abspath    import sys    import os        #PREFIX = dirname(abspath(__file__))        ## 这段代码是用于解决中文报错的问题      reload(sys)      sys.setdefaultencoding("utf8")      #####################################################                 defaultWaitTime = 1        def getHtmlContent(url):        global defaultWaitTime        content = None        retry = 0        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36'}        AccessFrequency = defaultWaitTime        while retry < 5:            try:                r = requests.get(url,timeout=10,headers=headers)                content = r.content                return content            except:                retry+=1                time.sleep(AccessFrequency)        return content    def Test():        content = getHtmlContent("http://blog.csdn.net/figo829/article/details/18015537")    #   print content        if __name__ == '__main__':        Test()