使用python抓取有路网图书信息(原创)
2014-01-22 14:12
357 查看
以前挺喜欢去有路网买二手书的,但是有路网有个缺陷,就是放在图书列表中的书很多都没货了,尤其是一些热门的方向,比如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
# 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
相关文章推荐
- 使用node.js抓取有路网图书信息(原创)
- 【python日常一】使用python抓取拉勾网职位信息并做简单统计分析
- Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
- 使用Python抓取网页信息
- 使用python抓取豆瓣电影信息
- 使用Python3.x抓取58同城(南京站)的演出票的信息
- 使用htmlparser简单抓取京东图书信息存入数据库的小例子
- Python使用scrapy抓取网站sitemap信息的方法
- 使用Python抓取网易云音乐所有歌手信息
- 在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
- 使用python BeautifulSoup库抓取58手机维修信息
- python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容
- 使用Jsoup抓取京东图书分类页面图书信息
- 使用python抓取网页(以人人网新鲜事和团购网信息为例)
- 关于用burp抓取python上网信息的使用方法
- Python爬虫实战一之使用Beautiful Soup抓取百度招聘信息并存储excel文件
- python:使用requests和bs4爬去豆瓣图书信息
- 使用Python抓取网页信息
- 使用python抓取有道词典的网页并返回结果信息
- 使用Python抓取网页信息