以前挺喜欢去有路网买二手书的,但是有路网有个缺陷,就是放在图书列表中的书很多都没货了,尤其是一些热门的方向,比如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

使用python抓取有路网图书信息(原创)的更多相关文章

  1. 使用node.js抓取有路网图书信息(原创)

    之前写过使用python抓取有路网图书信息,见http://www.cnblogs.com/dyf6372/p/3529703.html. 最近想学习一下Node.js,所以想试试手,比较一下http ...

  2. Python 抓取网页并提取信息(程序详解)

    最近因项目需要用到python处理网页,因此学习相关知识.下面程序使用python抓取网页并提取信息,具体内容如下: #---------------------------------------- ...

  3. 用python抓取智联招聘信息并存入excel

    用python抓取智联招聘信息并存入excel tags:python 智联招聘导出excel 引言:前一阵子是人们俗称的金三银四,跳槽的小朋友很多,我觉得每个人都应该给自己做一下规划,根据自己的进步 ...

  4. 使用python抓取58手机维修信息

    之前在ququ的博客上看到说 python 中的BeautifulSoup 挺好玩的,今天下午果断下载下来,看了下api,挺好用的,完了2把,不错. 晚上写了一个使用python抓取58手机维修信息的 ...

  5. python抓取链家房源信息(二)

    试着用scrapy将之前写的抓取链家网信息的重新写了写 然后先是用了第一页的网页作为测试,调试代码,然后发现总是抓取的时候遇见了 类似于这样的问题,并且抓取不到信息 2017-03-28 17:52: ...

  6. python抓取链家房源信息(三)

    之前写过一个链家网北京二手房的数据抓取,然后本来今天想着要把所有的东西弄完,但是临时有事出去了一趟,耽搁了一下,然后现在是想着把北京的二手房的信息都进行抓取,并且存储在mongodb中, 首先是通过' ...

  7. python抓取链家房源信息

    闲着没事就抓取了下链家网的房源信息,抓取的是北京二手房的信息情况,然后通过网址进行分析,有100页,并且每页的url都是类似的 url = 'https://bj.lianjia.com/ershou ...

  8. 我的第一个爬虫程序:利用Python抓取网页上的信息

    题外话 我第一次听说Python是在大二的时候,那个时候C语言都没有学好,于是就没有心思学其他的编程语言.现在,我的毕业设计要用到爬虫技术,在网上搜索了一下,Python语言在爬虫技术这方面获得一致好 ...

  9. 简单的抓取淘宝关键字信息、图片的Python爬虫|Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇)

    Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇) 淘宝改字段,Bugfix,查看https://github.com/hunterhug/taobaoscrapy.git 由于Gith ...

随机推荐

  1. Delphi静态加载DLL和动态加载DLL示例

    下面以Delphi调用触摸屏动态库xtkutility.dll为例子,说明如何静态加载DLL和动态加载DLL. 直接上代码. 1.静态加载示例 unit Unit1; interface uses W ...

  2. ASC(1)G(上升时间最长的序列)

    G - Beautiful People Time Limit: 10000/5000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Other ...

  3. iOS快速集成检查更新

    一直以为Appstore有了检查版本是否更新的机制,我们在APP上做这个更新功能会被拒,但是也有看到一些APP也是做了这个更新功能的.因为在网上没有找到完全正确的方法能获取到iTunes里的数据的,于 ...

  4. 进程关系之tcgetpgrp、tcsetpgrp和tcgetsid函数

    需要有一种方法来通知内核哪一个进程组是前台进程组,这样,终端设备驱动程序就能了解将终端输入和终端产生的信号送到何处. #include <unistd.h> pid_t tcgetpgrp ...

  5. Linux服务器的常用备份方法

    系统备份是系统管理工作中十分重要的一个环切,本文详细介绍了各种Linux系统的备份方法,相信对大家的日常管理工作有所帮助. 备份是一项重要的工作,但是很多人没有去做.一旦由于使用不当造成数据丢失,备份 ...

  6. BIO与NIO、AIO的区别

    IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO      在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个Serve ...

  7. B/S的验证控件

    验证控件 首先设置一下框架,设置为.net framework 4.0,在4.5下貌似会报错,设置方法为项目上右键/属性页/找到左侧菜单栏里的生成/将框架版本改为4.0. 一.非空验证:Require ...

  8. spring beans的写入工具——spring-beans-writer

    spring-beans-writer是我曾经为动态生成spring beans配置文件做的一个写入工具,托管地址: https://github.com/bluejoe2008/spring-bea ...

  9. 之前做web性能优化的一些个人心得

    一个web项目后期的维护主要在于性能方面.数据吞吐量一旦增大各种bug都出来了.那些通过硬件<数据库分表,数据库主从分离,读写分离>等的一些手段此处就不多说了.本文主要在编码方面做一个性能 ...

  10. 使用greenDao出现Property 'status' is not part of ********.NewCommentDao@717de9a

    应为版本号的原因造成的,升级Schema版本号即可