[四星]写一个脚本,自动找到相关图书和价格

除了美化之外,还可以来尝试挑战一下任务
回复
头像
oneleaf
论坛管理员
帖子: 10441
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

[四星]写一个脚本,自动找到相关图书和价格

#1

帖子 oneleaf » 2009-09-22 9:56

1 任务内容: 写一个脚本,根据输入的关键词,自动到当当/卓越/新华书店去搜索到书籍和价格,并按价格排序显示为 ”来源 图书名称 价格“ 列表。

2 任务的难度: 四星

3 任务的目的: 掌握bash和相关模拟提交http请求

4 任务所涉及的软件: bash [wget/w3m]

5 任务将大致消耗的时间: 3~5天

6 任务涉及网站: http://www.dangdang.com/ http://www.amazon.cn/ http://www.xinhuabookstore.com/
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

Re: [四星]写一个脚本,自动找到相关图书和价格

#2

帖子 xiooli » 2009-09-22 10:30

有些搜索会有很多哦,到底要几条还是都要阿?
头像
oneleaf
论坛管理员
帖子: 10441
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

Re: [四星]写一个脚本,自动找到相关图书和价格

#3

帖子 oneleaf » 2009-09-22 10:31

xiooli 写了:有些搜索会有很多哦,到底要几条还是都要阿?
都要
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

Re: [四星]写一个脚本,自动找到相关图书和价格

#4

帖子 xiooli » 2009-09-22 10:34

奥克,mark
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: [四星]写一个脚本,自动找到相关图书和价格

#5

帖子 eexpress » 2009-09-22 11:14

处理字符,用bash,bt的。
● 鸣学
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

Re: [四星]写一个脚本,自动找到相关图书和价格

#6

帖子 xiooli » 2009-09-22 18:00

完成!

代码: 全选

用法: ./booksearch.sh keyword
注意: 由于所有的条目均会获取,故而在搜索出很多项目时会剧慢无比,无忍耐力者请谨慎尝试。。。

代码: 全选

#!/bin/bash

# Author xiooli <xioooli[at]yahoo.com.cn>
# 2009.09.22

dangdang() {
	
	local url key page maxpage
	key="$(iconv -f utf8 -t gbk <<< "$1"|uni2ascii -a J)"
	page=1
	url="http://search.book.dangdang.com/search.aspx?key=${key}&page=${page}&order=1"
	maxpage="`w3m -dump_source "$url"|grep -m1 -o "maxPage=.*;"|grep -o "[0-9]*"`"
	if [ x"$maxpage" != x ]; then
		for page in `seq 1 "$maxpage"`; do
			url="http://search.book.dangdang.com/search.aspx?key=${key}&page=${page}&order=1"
			w3m -dump "$url" \
			|awk '/\[page_down\]|\[buttom_gou\]|\[button_det\]|\[enregister\]/{
			getline
			tmp=$0
			getline
			if($0 ~ /^$/ && tmp !~ /\[next/)
				{printf "当当网 "tmp
				} else if(tmp !~ /\[next/) {
				printf "当当网 "tmp$0} 
			}
			/¥/{print " 价格: "$1}' \
			|sed "s/¥[^¥]*//;s/折扣.*//"
		done
		echo
	fi
}

amazon() {
	local url key page maxnum maxpage
	key="$(iconv -f utf8 -t gbk <<< "$1"|uni2ascii -a J)"
	page=1
	url="http://www.amazon.cn/s?pageletid=headsearch&searchType=&i=books&keywords=${key}&Go.x=0&Go.y=0&searchKind=keyword&sort=price&page=${page}"
	maxnum="$(wget "$url" -q -O-|grep -o "class=\"resultCount\"[^<]*<"\
	|grep -o [0-9,]*|tail -n1|tr -d ",")"
	if [ "$(($maxnum%12))" != 0 ]; then
		maxpage=$(($maxnum/12+1))
	else
		maxpage=$(($maxnum/12))
	fi	
	if [ x"$maxpage" != x ]; then
		for page in `seq 1 "$maxpage"`; do
			url="http://www.amazon.cn/s?pageletid=headsearch&searchType=&i=books&keywords=${key}&Go.x=0&Go.y=0&searchKind=keyword&sort=price&page=${page}"
			wget "$url" -q -O- \
			|awk -F"[<>]" '/srTitle/{printf "亚马逊 "$5}
			/saleprice/{if ($11 ~ /[0-9]/)print " 价格: "$11}'
		done
		echo
	fi
}

xinhua(){
local url key page maxpage
	key="$(echo "$1"|uni2ascii -a J)"
	page=1
	url="http://www.xinhuabookstore.com/search/?pagination.currentPage=${page}&pagination.pageSize=20&pagination.skipSize=10&Submit.y=16&Submit.x=40&keyword=${key}"
	maxpage="$(wget "$url" -q -O-|grep -o "条 .* 页"|awk '{print $2}')"
	if [ x"$maxpage" != x ]; then
		for page in `seq 1 "$maxpage"`; do
			url="http://www.xinhuabookstore.com/search/?pagination.currentPage=${page}&pagination.pageSize=20&pagination.skipSize=10&Submit.y=16&Submit.x=40&keyword=${key}"
			wget "$url" -q -O- \
			|awk -F"[<>]" '/class=\"fontb_2\"/{printf "新华网 "$9}
			/class=\"price3\"/{print " 价格: ¥ "$15}'
		done
		echo
	fi

}

{
	dangdang $1
	amazon $1
	xinhua $1
}|sort -t ¥ -k2 -n
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

Re: [四星]写一个脚本,自动找到相关图书和价格

#7

帖子 xiooli » 2009-09-23 8:48

晕哦,都没人顶,没意思。。。 :em20
头像
oneleaf
论坛管理员
帖子: 10441
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

Re: [四星]写一个脚本,自动找到相关图书和价格

#8

帖子 oneleaf » 2009-09-23 8:56

:em01
sort: 多字符标签 “¥”
./booksearch.sh: line 40: %12: 语法出错:此处需要运算符 (error token is "%12")
这两个错误该如何处理?
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

Re: [四星]写一个脚本,自动找到相关图书和价格

#9

帖子 xiooli » 2009-09-23 9:12

oneleaf 写了::em01
sort: 多字符标签 “¥”
./booksearch.sh: line 40: %12: 语法出错:此处需要运算符 (error token is "%12")
这两个错误该如何处理?
额?你搜的啥呀,难道没有搜索出东西,那就给maxnum赋一个默认值,还有那个sort的问题,我在arch上没有这种提示,可能是复制粘贴的问题,我直接附上文件吧。
您没有权限查看这个主题的附件。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: [四星]写一个脚本,自动找到相关图书和价格

#10

帖子 eexpress » 2009-09-23 10:01

xiooli 写了:晕哦,都没人顶,没意思。。。 :em20
你缩到15行。就有人顶。
● 鸣学
t3swing
帖子: 1028
注册时间: 2008-11-01 21:42
来自: 树下板凳

Re: [四星]写一个脚本,自动找到相关图书和价格

#11

帖子 t3swing » 2009-09-23 10:20

纯支持!等下试试
民族的脊梁,是踏实做事的人,非只知道骂街的泼妇。
头像
yaoms
帖子: 4952
注册时间: 2007-10-19 14:51
来自: 深圳

Re: [四星]写一个脚本,自动找到相关图书和价格

#12

帖子 yaoms » 2009-09-23 11:04

xiooli 写了:晕哦,都没人顶,没意思。。。 :em20

代码: 全选

$ booksearch perl
/home/yaoms/bin/booksearch: line 9: uni2ascii: command not found
/home/yaoms/bin/booksearch: line 12: w3m: command not found
/home/yaoms/bin/booksearch: line 35: uni2ascii: command not found
/home/yaoms/bin/booksearch: line 40: %12: syntax error: operand expected (error token is "%12")
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
yaoms
帖子: 4952
注册时间: 2007-10-19 14:51
来自: 深圳

Re: [四星]写一个脚本,自动找到相关图书和价格

#13

帖子 yaoms » 2009-09-23 11:06

建议用 纯 perl 实现。
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
thunderdrum
帖子: 27
注册时间: 2009-02-12 9:39

Re: [四星]写一个脚本,自动找到相关图书和价格

#14

帖子 thunderdrum » 2009-09-23 13:35

我来顶~
很好的学习机会。
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

Re: [四星]写一个脚本,自动找到相关图书和价格

#15

帖子 xiooli » 2009-09-23 16:47

eexpress 写了:
xiooli 写了:晕哦,都没人顶,没意思。。。 :em20
你缩到15行。就有人顶。
ee写一个15行以内的大家来围观 :em02
yaoms 写了:建议用 纯 perl 实现。
perl的不会,期待ee阿姨的perl版本
回复