zoukankan      html  css  js  c++  java
  • 使用python抓取有路网图书信息(原创)

      以前挺喜欢去有路网买二手书的,但是有路网有个缺陷,就是放在图书列表中的书很多都没货了,尤其是一些热门的方向,比如android,在列表中的书大多都没有货了,你必须一个一个点进入查看详细信息才能得知图书是否有货。因此,很久之前用python写了一个抓取的脚本,用来按书名搜索图书以及库存信息。现在拿出来与大家分享一下,因为是最开始学python的时候写的,有些地方写的不是特别好。比如那个时候对于正则表达式不是特别懂,所以用的不是特别好。其次,采用urllib库发送http请求的,效率太低。建议使用tornado库或者采用node.js(见 http://www.cnblogs.com/dyf6372/p/3536821.html)。哦,还有一个问题,网页编码处理的不好,可能部分网页会乱码。废话少说,直接上代码:

    # coding: utf-8

    import urllib
    import re
    import sys
    reload(sys)
    sys.setdefaultencoding('utf8')


    class ReadFromWeb:
      def setKeyWord(self, keyword):
        self.url = 'http://www.youlu.net/search/result/?isbn=&publisherName=&author=&bookName=' + urllib.quote(keyword.decode('utf-8').encode('gb18030'))

      def getHtml(self):
        try:
          self.html = urllib.urlopen(self.url).read().decode('gb18030').encode('utf-8')
        except UnicodeDecodeError:
          self.html = urllib.urlopen(self.url).read()
        finally:
          return self.html

      def list(self):
        self.id_group = re.findall('<a href="/[0-9]*" target="_blank">.*</a>', self.html)
        for in_id in self.id_group:
          try:
            url = re.findall('[0-9]+',in_id)[0].encode('utf-8')
            detail = re.findall('>.*<',in_id)[0].encode('utf-8')
          except UnicodeDecodeError:
            url = re.findall('[0-9]+',in_id)[0]
            detail = re.findall('>.*<',in_id)[0]

          if detail.find('img')<0 and detail.find('我要购买')<0:
            if self.getDetail(url) > 0:
              print detail[1:-1]
              print '有货:'+str(self.getDetail(url))+":"+"http://www.youlu.net/"+url
            else:
              print detail[1:-1]
              print '无货'+":"+"http://www.youlu.net/"+url

      def getDetail(self, url):
        target = "http://www.youlu.net/" + str(url);
        try:
          returnStr = urllib.urlopen(target).read().decode('gb18030').encode('utf-8')
        except UnicodeDecodeError:
          return 0
        startStr = re.findall('startRequestBookBuyLink(.*)',returnStr)[0]
        realNumber = int(startStr.split(',')[3].strip()[1:-1])
        return realNumber

      def setSearchNextPage(self):
        self.nextPage = re.findall('(?<="下一页" href=").*(?=">下一页</a>)', self.html)
        if len(self.nextPage) > 0:
          self.url = self.nextPage[0]
          return True
        return False

      def setAndSearch(self,keyword):
        self.setKeyWord(keyword)
        self.getHtml()
        self.list()
        while self.setSearchNextPage():
          self.getHtml()
          self.list()

    if __name__ == "__main__":
      keyword = raw_input("Type in search keyword:")
      readFromWeb = ReadFromWeb()
      readFromWeb.setAndSearch(keyword)

    下面是使用结果示例:

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

    Type in search keyword:java
    JAVA 2实用教程实验指导与习题解答-(第三版)
    有货:190:http://www.youlu.net/2597032
    Java面向对象程序设计
    有货:88:http://www.youlu.net/2504849
    Java EE 5开发基础与实践
    有货:70:http://www.youlu.net/500752
    Java 2实用教程 (第三版)
    有货:68:http://www.youlu.net/5310
    Java课程设计(第二版)
    有货:61:http://www.youlu.net/500751
    JAVA 2实用教程实验指导与习题解答-(第三版)
    有货:60:http://www.youlu.net/2596529
    JAVA 2实用教程(第三版)-实验指导与习题解答
    有货:48:http://www.youlu.net/10750
    Java 语言与面向对象程序设计(第2版)
    有货:47:http://www.youlu.net/356506
    Java程序设计教程(第2版)
    有货:42:http://www.youlu.net/1008395
    Java XML应用程序设计
    有货:39:http://www.youlu.net/338105
    Java程序设计习题集(含参考答案)
    有货:37:http://www.youlu.net/1206253
    Java大学实用教程学习指导(第2版)
    有货:37:http://www.youlu.net/461648

  • 相关阅读:
    NYIST 46 最少乘法次数
    OpenSSL命令---rsa
    Javah生成JNI头文件
    Stbdroid之ShapeDrawable
    Android之判断设备网络连接状态,并判断连接方式
    [置顶] 程序员必知(二):位图(bitmap)
    中断子系统8_软中断入口处理
    二叉搜索树的后续遍历序列
    整理生命
    sicily9162. RAZLIKA
  • 原文地址:https://www.cnblogs.com/dyf6372/p/3529703.html
Copyright © 2011-2022 走看看