Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地

本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下

#!/user/bin/python
# -*- coding: gbk -*-
#Spider.py 

import urllib2
import httplib
import StringIO
import gzip
import re
import chardet
import sys
import os
import datetime
from xml.dom.minidom import Document
from BeautifulSoup import BeautifulSoup 

## 这段代码是用于解决控制台打印汉字报错的问题
reload(sys)
sys.setdefaultencoding("utf8")
##################################################### 

## debug模式开关,开启后可以看到Http请求的头部信息以及debug日志
DEBUG = 1
NO_DEBUG = 0
httplib.HTTPConnection.debuglevel = DEBUG
## 是否显示爬取网页源代码开关
showSrcCode = False
## 压缩方式
ZIP_TYPE = "gzip" 

fileName = "auctions"
location = "d://spiderData/" 

## header
headerConfig = {"User-Agent":"taobao-yanyuan.qzs", "Accept-encoding":ZIP_TYPE}
##################################################### 

#############class SpiderConfig #####################
class SpiderConfig:
  """
    configuration for spider name and url
  """
  def __init__(self, name, url):
    self.name = name
    self.url = url
##################################################### 

##############class SpiderAuctionDomain##############
class SpiderAuctionDomain:
  """
    Store information with auctions spidered by python
  """
  title = ""
  url = ""
  img = ""
  price = "" 

  def __init__(self):
    pass 

##################################################### 

########class SpiderDefaultErrorHandler##############
class SpiderDefaultErrorHandler(urllib2.HTTPDefaultErrorHandler):
  def http_error_default(self, req, fp, code, msg, hdrs):
    """
      default error process handler for spider
    """
    result = urllib2.HTTPError(req.get_full_url(), code, msg, hdrs, fp)
    result.status = code
    result.url = req.get_full_url() 

    print "<", result.url, "Exception code :", result.status, ">" 

    return result
##################################################### 

#############class SpiderHandler#####################
class SpiderHandler:
  """
    spider handler
  """ 

  def spider(self, spiderConfig):
    try:
      request = urllib2.Request(spiderConfig.url) 

      ## configure request hreader
      for key,val in headerConfig.items():
        request.add_header(key, val) 

      ## build opener
      opener = urllib2.build_opener(SpiderDefaultErrorHandler()) 

      ## open request
      openRequest = opener.open(request) 

      ## read data
      spiderData = openRequest.read() 

      ## close
      opener.close() 

      if 0 == len(spiderData):
        return 

      if ZIP_TYPE== openRequest.headers.get("Content-Encoding"):
        spiderData = SpiderHandler.gzipData(self, spiderData) 

      if httplib.HTTPConnection.debuglevel == DEBUG and showSrcCode:
        print spiderData 

      # parse html
      SpiderHandler.parse(self, spiderData) 

    except Exception,x:
      print "spider process Exception:", x 

  def parse(self, spiderData):
    """
      parse html content
    """ 

    if httplib.HTTPConnection.debuglevel == DEBUG:
      charsetAnalyze = chardet.detect(spiderData)
      print "analyze spider data encode :",charsetAnalyze["encoding"] 

    print "执行解析", fileName 

    soup = BeautifulSoup(spiderData)
    encode = soup.originalEncoding 

    encoding = lambda x : x.encode(encode) 

    if httplib.HTTPConnection.debuglevel == DEBUG:
      print "识别到编码:", encode
      title = soup.head.title.string
      print encoding(title) 

    spiderContents = soup.findAll(name="div", attrs={"class":"main-box avil"})
    auctions = ["%s" % s for s in spiderContents] 

    if auctions is None:
      return 

    auctionList = [] 

    for auc in auctions:
      auctionDomain = SpiderAuctionDomain()
      # parse auction link
      links = re.search(re.compile(r'<a href=[\"|\']http://ju.taobao.com/tg/life_home.htm\?item_id=([^>]*)[\"|\']', re.IGNORECASE), auc)
      if links is not None :
        auctionDomain.link = encoding("http://ju.taobao.com/tg/life_home.htm?item_id=" + "".join(["%s" % s for s in links.groups() if len(s) > 0])) 

      #parse auction title
      titles = re.search(re.compile(r"([^>]*)</a></h2>", re.IGNORECASE), auc)
      if titles is not None:
        auctionDomain.title = encoding("".join(["%s" % t for t in titles.groups() if len(t) > 0])) 

      #parse auction price
      price = re.search(re.compile(r"<strong class=\"J_juPrices\".*</b>([^<]*)</strong>", re.IGNORECASE), auc)
      if price is not None:
        auctionDomain.price = "".join(["%s" % p for p in price.groups() if len(p) > 0]) 

      #parse image url
      imgs = re.search(re.compile(r"<img src=[\'\"]([^>]*)[\'\"]", re.IGNORECASE), auc)
      if imgs is not None:
        auctionDomain.img = "".join(["%s" % i for i in imgs.groups() if len(i) > 0]) 

      auctionList.append(auctionDomain) 

    print "成功解析商品信息:"
    for a in auctionList:
      print "--->",a.title 

    # sort auction list
    auctionList = SpiderHandler.sortAuctionList(self, auctionList) 

    # save in file
    SpiderHandler.save(self, auctionList) 

    print "解析完成" 

    pass 

  def sortAuctionList(self, auctionList):
    """
      冒泡排序,按照价格排序
    """
    length = len(auctionList)
    if length < 2:
      return auctionList
    else:
      for i in range(length-1):
        for j in range(length - i -1):
          if float(auctionList[j].price) > float(auctionList[j+1].price):
            auctionList[j], auctionList[j+1] = auctionList[j+1], auctionList[j]
    return auctionList
    pass 

  def save(self, auctionList):
    if auctionList is not None:
      doc = Document() 

      auctions = doc.createElement("auctions")
      doc.appendChild(auctions) 

      for auc in auctionList:
        auction = doc.createElement("auction")
        auctions.appendChild(auction) 

        SpiderHandler.generateXML(self, doc, auction, "title", auc.title)
        SpiderHandler.generateXML(self, doc, auction, "price", auc.price)
        SpiderHandler.generateXML(self, doc, auction, "img", auc.img)
        SpiderHandler.generateXML(self, doc, auction, "link", auc.link) 

      if False == os.path.exists(location):
        os.mkdir(location) 

      file = open(location+fileName+".xml", 'w')
      file.write(doc.toprettyxml())
      file.close() 

      if httplib.HTTPConnection.debuglevel == DEBUG:
        print doc.toprettyxml() 

  def generateXML(self, doc, f, name, txt):
    c = doc.createElement(name)
    f.appendChild(c)
    c.appendChild(doc.createTextNode(txt)) 

  def gzipData(self, spiderData):
    """
      get data from gzip
    """
    if 0 == len(spiderData):
      return spiderData
    spiderDataStream = StringIO.StringIO(spiderData)
    spiderData = gzip.GzipFile(fileobj=spiderDataStream).read()
    return spiderData
##################################################### 

if __name__ == "__main__":
  nowtime = lambda:datetime.datetime.strftime(datetime.datetime.now(),"%Y年%m月%d日 %H时%m分%S秒") 

  needSpiderUrl = {"suzhou":"http://ju.taobao.com/suzhou",
           "hangzhou":"http://ju.taobao.com/hangzhou",
           "shanghai":"http://ju.taobao.com/shanghai",
           "beijing":"http://ju.taobao.com/beijing",
           "chengdu":"http://ju.taobao.com/chengdu"} 

  configList = []
  for k,v in needSpiderUrl.items():
    spiderConfig = SpiderConfig(k, v)
    configList.append(spiderConfig) 

  spiderHandler = SpiderHandler() 

  print "爬虫执行开始时间:",nowtime()
  for spiderConfig in configList:
    fileName = spiderConfig.name
    spiderHandler.spider(spiderConfig) 

  print "爬虫执行完毕时间:",nowtime() 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Python 抓取动态网页内容方案详解
  • 零基础写python爬虫之使用urllib2组件抓取网页内容
  • 使用Python编写简单网络爬虫抓取视频下载资源
  • python采用requests库模拟登录和抓取数据的简单示例
  • python抓取网页图片示例(python爬虫)
  • Python实现抓取页面上链接的简单爬虫分享
  • 通过抓取淘宝评论为例讲解Python爬取ajax动态生成的数据(经典)
  • python 自动提交和抓取网页
  • Python爬虫抓取手机APP的传输数据
  • python制作爬虫并将抓取结果保存到excel中
(0)

相关推荐

  • Python实现抓取页面上链接的简单爬虫分享

    除了C/C++以外,我也接触过不少流行的语言,PHP.java.javascript.python,其中python可以说是操作起来最方便,缺点最少的语言了. 前几天想写爬虫,后来跟朋友商量了一下,决定过几天再一起写.爬虫里重要的一部分是抓取页面中的链接,我在这里简单的实现一下. 首先我们需要用到一个开源的模块,requests.这不是python自带的模块,需要从网上下载.解压与安装: 复制代码 代码如下: $ curl -OL https://github.com/kennethreitz/

  • python抓取网页图片示例(python爬虫)

    复制代码 代码如下: #-*- encoding: utf-8 -*-'''Created on 2014-4-24 @author: Leon Wong''' import urllib2import urllibimport reimport timeimport osimport uuid #获取二级页面urldef findUrl2(html):    re1 = r'http://tuchong.com/\d+/\d+/|http://\w+(?<!photos).tuchong.co

  • python 自动提交和抓取网页

    下面是用python写的,使用lxml来做html分析,从网上看到的,说是分析速度最快的哦,不过没有验证过.好了,上代码. 复制代码 代码如下: import urllib import urllib2 import urlparse import lxml.html def url_with_query(url, values): parts = urlparse.urlparse(url) rest, (query, frag) = parts[:-2], parts[-2:] return

  • Python爬虫抓取手机APP的传输数据

    大多数APP里面返回的是json格式数据,或者一堆加密过的数据 .这里以超级课程表APP为例,抓取超级课程表里用户发的话题. 1.抓取APP数据包 方法详细可以参考这篇博文:Fiddler如何抓取手机APP数据包 得到超级课程表登录的地址:http://120.55.151.61/V2/StudentSkip/loginCheckV4.action 表单: 表单中包括了用户名和密码,当然都是加密过了的,还有一个设备信息,直接post过去就是. 另外必须加header,一开始我没有加header得

  • python制作爬虫并将抓取结果保存到excel中

    学习Python也有一段时间了,各种理论知识大体上也算略知一二了,今天就进入实战演练:通过Python来编写一个拉勾网薪资调查的小爬虫. 第一步:分析网站的请求过程 我们在查看拉勾网上的招聘信息的时候,搜索Python,或者是PHP等等的岗位信息,其实是向服务器发出相应请求,由服务器动态的响应请求,将我们所需要的内容通过浏览器解析,呈现在我们的面前. 可以看到我们发出的请求当中,FormData中的kd参数,就代表着向服务器请求关键词为Python的招聘信息. 分析比较复杂的页面请求与响应信息,

  • 零基础写python爬虫之使用urllib2组件抓取网页内容

    版本号:Python2.7.5,Python3改动较大,各位另寻教程. 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地.  类似于使用程序模拟IE浏览器的功能,把URL作为HTTP请求的内容发送到服务器端, 然后读取服务器端的响应资源. 在Python中,我们使用urllib2这个组件来抓取网页. urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件. 它以urlopen函数的形式提供了一个非常简单的接口. 最简

  • 通过抓取淘宝评论为例讲解Python爬取ajax动态生成的数据(经典)

    在学习python的时候,一定会遇到网站内容是通过 ajax动态请求.异步刷新生成的json数据 的情况,并且通过python使用之前爬取静态网页内容的方式是不可以实现的,所以这篇文章将要讲述如果在python中爬取ajax动态生成的数据. 至于读取静态网页内容的方式,有兴趣的可以查看本文内容. 这里我们以爬取淘宝评论为例子讲解一下如何去做到的. 这里主要分为了四步: 一 获取淘宝评论时,ajax请求链接(url) 二 获取该ajax请求返回的json数据 三 使用python解析json数据

  • 使用Python编写简单网络爬虫抓取视频下载资源

    我第一次接触爬虫这东西是在今年的5月份,当时写了一个博客搜索引擎,所用到的爬虫也挺智能的,起码比电影来了这个站用到的爬虫水平高多了! 回到用Python写爬虫的话题. Python一直是我主要使用的脚本语言,没有之一.Python的语言简洁灵活,标准库功能强大,平常可以用作计算器,文本编码转换,图片处理,批量下载,批量处理文本等.总之我很喜欢,也越用越上手,这么好用的一个工具,一般人我不告诉他... 因为其强大的字符串处理能力,以及urllib2,cookielib,re,threading这些

  • Python 抓取动态网页内容方案详解

    用Python实现常规的静态网页抓取时,往往是用urllib2来获取整个HTML页面,然后从HTML文件中逐字查找对应的关键字.如下所示: 复制代码 代码如下: import urllib2 url="http://mm.taobao.com/json/request_top_list.htm?type=0&page=1" up=urllib2.urlopen(url)#打开目标页面,存入变量up cont=up.read()#从up中读入该HTML文件 key1='<a

  • python采用requests库模拟登录和抓取数据的简单示例

    如果你还在为python的各种urllib和urlibs,cookielib 头疼,或者还还在为python模拟登录和抓取数据而抓狂,那么来看看我们推荐的requests,python采集数据模拟登录必备利器! 这也是python推荐的HTTP客户端库: 本文就以一个模拟登录的例子来加以说明,至于采集大家就请自行发挥吧. 代码很简单,主要是展现python的requests库的简单至极,代码如下: s = requests.session() data = {'user':'用户名','pass

随机推荐