精华内容
下载资源
问答
  • 采用scrapy-redis爬去京东图书,当当图书和Amazon图书,采用分布式爬虫爬取数据,实现爬虫的暂停和开始,断点再续,URL去重,数据存储等,属于轻量级爬虫
  • 使用JavaScript编写的Amazon图书下载器。 Freemazon是一个半自动化的框架,可使用其SITB(书内搜索)API从Amazon提取扫描的书页。 该代码仅用于教育目的。 不建议将其用于其他用途(尤其是商业用途),并且可能...
  • 采用Product Advertising API,我在做书店销售线上系统的时候用的,用PHP编写脚本还是很好用的.希望对各位有帮助
  • 亚马逊图书爬虫.py

    2019-05-30 00:18:35
    这个是爬取亚马逊图书资源的文件,实现简单的爬虫机制。
  • 亚马逊图书列表的顶部添加一目了然的信息,以减少滚动。 •如果该书是自行发布的,则显示“自发布” •显示排名,评级,评论,以周为单位的年龄和比率(以几周为单位的年龄评论除以年龄) •显示页数和估计的字数 ...
  • 最近买了台Kindle,感觉亚马逊上的图书资源质量挺好,还时不时地会有价格低但质量高的书出售,但限于亚马逊并没有很好的优惠提醒功能,自己天天盯着又很累。于是,我自己写了一个基于Java的亚马逊图书监控的简单爬虫...
  • 一共577个分类。
  • 注:1.本程序采用MSSQLserver数据库存储,请运行程序前手动修改程序开头处的数据库链接信息 2.需要bs4、requests、pymssql库支持 3.支持多线程 from bs4 import BeautifulSoup import re,requests,pymysql,...
  • Python亚马逊图书爬虫

    千次阅读 2018-02-23 15:54:51
    encoding=utf8 import requests import time ...article=str(article).replace('亚马逊编辑推荐:','') print article def main(): html=get_detail() parse_detail(html) if name == 'main': main()

    encoding=utf8
    
    import requests
    import time
    from requests.exceptions import RequestException
    import urllib
    from pyquery import PyQuery as pq
    import json
    import re
    from bs4 import BeautifulSoup
    from config import *
    def get_detail():
    times=int(time.time())
    datas = {
    'ref_':'dp_apl_pc_loaddesc',
    'asin':'B00JZ96ZI8',
    'cacheTime':times,
    'merchantId':'A1AJ19PSB66TGU',
    'deviceType':'web'
    }
    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'
    }
    url='https://www.amazon.cn/gp/product-description/ajaxGetProuductDescription.html?'+urllib.urlencode(datas)
    #必须要加请求头
    response = requests.get(url, headers=headers)
    try:
    if response.status_code == 200:
    return response.text
    except RequestException:
    print u'请求索引页出错'
    #return None
    def parse_detail(html):
    #生成BeautifulSoup对象并使用lxml解析
    soup = BeautifulSoup(html, 'lxml')
    #获取目录
    directory = soup.select('#s_content_4 > p')[0]
    #获取编辑推荐
    article = soup.select('#s_content_0 > p')[0]
    article=str(article).replace('亚马逊编辑推荐:','')
    print article
    def main():
    html=get_detail()
    parse_detail(html)
    if name == 'main':
    main()


    展开全文
  • 亚马逊电子书备份 科技之巅 《麻省理工科技评论》50大全球突破性技术深度剖析 https://www.amazon.cn/dp/B01MXLYH2J Hadoop技术内幕:深入解析MapReduce架构设计与实现原理 https://www.amazon.cn/dp/B00ETOV4IA ...
  • 亚马逊的Goodreads评级是一个小扩展,可在Amazon页面上显示Goodreads评级。 它还提供了直接访问Goodreads页面的链接。 适用于大多数Amazon域。 ( 对亚马逊的## LEGAL STUFF Goodreads评级被许可为Apache 2.0。 ...
  • #获取该关键字在图书网站上的总页数 def getPageLength(webSiteName,url): try: soup = getSoupObject(url) if webSiteName == 'DangDang': a = soup('a',{'name':'bottom-page-turn'}) return a[-1].string ...

    注:1.本程序采用MS SQL server数据库存储,请运行程序前手动修改程序开头处的数据库链接信息

    2.需要bs4、requests、pymssql库支持

    3.支持多线程

    from bs4 import BeautifulSoup
    import re,requests,pymysql,threading,os,traceback
    
    try:
        conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root', db='book',charset="utf8")
        cursor = conn.cursor()
    except:
        print('\n错误:数据库连接失败')
    
    #返回指定页面的html信息
    def getHTMLText(url):
        try:
            headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
            r = requests.get(url,headers = headers)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return r.text
        except:
            return ''
        
    #返回指定url的Soup对象
    def getSoupObject(url):
        try:
            html = getHTMLText(url)
            soup = BeautifulSoup(html,'html.parser')
            return soup
        except:
            return ''
    
    #获取该关键字在图书网站上的总页数
    def getPageLength(webSiteName,url):
        try:
            soup = getSoupObject(url)
            if webSiteName == 'DangDang':
                a = soup('a',{'name':'bottom-page-turn'})
                return a[-1].string
            elif webSiteName == 'Amazon':
                a = soup('span',{'class':'pagnDisabled'})
                return a[-1].string
        except:
            print('\n错误:获取{}总页数时出错...'.format(webSiteName))
            return -1
    
    class DangDangThread(threading.Thread):
        def __init__(self,keyword):
            threading.Thread.__init__(self)
            self.keyword = keyword
    
        def run(self):
            print('\n提示:开始爬取当当网数据...')
            count = 1
        
            length = getPageLength('DangDang','http://search.dangdang.com/?key={}'.format(self.keyword))#总页数
            tableName = 'db_{}_dangdang'.format(self.keyword)
    
            try:
                print('\n提示:正在创建DangDang表...')
                cursor.execute('create table {} (id int ,title text,prNow text,prPre text,link text)'.format(tableName))
       
                print('\n提示:开始爬取当当网页面...')
                for i in range(1,int(length)):
                    url = 'http://search.dangdang.com/?key={}&page_index={}'.format(self.keyword,i)
                    soup = getSoupObject(url)
                    lis = soup('li',{'class':re.compile(r'line'),'id':re.compile(r'p')})
                    for li in lis:
                        a = li.find_all('a',{'name':'itemlist-title','dd_name':'单品标题'})
                        pn = li.find_all('span',{'class': 'search_now_price'})
                        pp = li.find_all('span',{'class': 'search_pre_price'})
    
                        if not len(a) == 0:
                            link = a[0].attrs['href']
                            title = a[0].attrs['title'].strip()
                        else:
                            link = 'NULL'
                            title = 'NULL'
    
                        if not len(pn) == 0:
                            prNow = pn[0].string
                        else:
                            prNow = 'NULL'
    
                        if not len(pp) == 0:
                            prPre = pp[0].string
                        else:
                            prPre = 'NULL'
                        sql = "insert into {} (id,title,prNow,prPre,link) values ({},'{}','{}','{}','{}')".format(tableName,count,title,prNow,prPre,link)
                        cursor.execute(sql)
                        print('\r提示:正在存入当当数据,当前处理id:{}'.format(count),end='')
                        count += 1
                        conn.commit()
            except:
                pass
        
    
    
    class AmazonThread(threading.Thread):
        def __init__(self,keyword):
            threading.Thread.__init__(self)
            self.keyword = keyword
    
        def run(self):
            print('\n提示:开始爬取亚马逊数据...')
            count = 1
    
            length = getPageLength('Amazon','https://www.amazon.cn/s/keywords={}'.format(self.keyword))#总页数
            tableName = 'db_{}_amazon'.format(self.keyword)
            
            try:
                print('\n提示:正在创建Amazon表...')
                cursor.execute('create table {} (id int ,title text,prNow text,link text)'.format(tableName))
       
                print('\n提示:开始爬取亚马逊页面...')
                for i in range(1,int(length)):
                    url = 'https://www.amazon.cn/s/keywords={}&page={}'.format(self.keyword,i)
                    soup = getSoupObject(url)
                    lis = soup('li',{'id':re.compile(r'result_')})
                    for li in lis:
                        a = li.find_all('a',{'class':'a-link-normal s-access-detail-page a-text-normal'})
                        pn = li.find_all('span',{'class': 'a-size-base a-color-price s-price a-text-bold'})
                        if not len(a) == 0:
                            link = a[0].attrs['href']
                            title = a[0].attrs['title'].strip()
                        else:
                            link = 'NULL'
                            title = 'NULL'
    
                        if not len(pn) == 0:
                            prNow = pn[0].string
                        else:
                            prNow = 'NULL'
    
                        sql = "insert into {} (id,title,prNow,link) values ({},'{}','{}','{}')".format(tableName,count,title,prNow,link)
                        cursor.execute(sql)
                        print('\r提示:正在存入亚马逊数据,当前处理id:{}'.format(count),end='')
                        count += 1
                        conn.commit()
            except:
                pass
    
    
    
    class JDThread(threading.Thread):
        def __init__(self,keyword):
            threading.Thread.__init__(self)
            self.keyword = keyword
    
        def run(self):
            print('\n提示:开始爬取京东数据...')
            count = 1
    
            tableName = 'db_{}_jd'.format(self.keyword)
            
            try:
                print('\n提示:正在创建JD表...')
                cursor.execute('create table {} (id int,title text,prNow text,link text)'.format(tableName))
    
                print('\n提示:开始爬取京东页面...')
                for i in range(1,100):
                    url = 'https://search.jd.com/Search?keyword={}&page={}'.format(self.keyword,i)
                    soup = getSoupObject(url)
                    lis = soup('li',{'class':'gl-item'})
                    for li in lis:
                        a = li.find_all('div',{'class':'p-name'})
                        pn = li.find_all('div',{'class': 'p-price'})[0].find_all('i')
    
                        if not len(a) == 0:
                            link = 'http:' + a[0].find_all('a')[0].attrs['href']
                            title = a[0].find_all('em')[0].get_text()
                        else:
                            link = 'NULL'
                            title = 'NULL'
                        
                        if(len(link) > 128):
                            link = 'TooLong'
    
                        if not len(pn) == 0:
                            prNow = '¥'+ pn[0].string
                        else:
                            prNow = 'NULL'
                        sql = "insert into {} (id,title,prNow,link) values ({},'{}','{}','{}')".format(tableName,count,title,prNow,link)
                        cursor.execute(sql)
                        print('\r提示:正在存入京东网数据,当前处理id:{}'.format(count),end='')
                        count += 1
                        conn.commit()
            except :
                pass
    
    def closeDB():
        global conn,cursor
        conn.close()
        cursor.close()
    
    def main():
        print('提示:使用本程序,请手动创建空数据库:Book,并修改本程序开头的数据库连接语句')
        keyword = input("\n提示:请输入要爬取的关键字:")
    
        dangdangThread = DangDangThread(keyword)
        amazonThread = AmazonThread(keyword)
        jdThread = JDThread(keyword)
    
        dangdangThread.start()
        amazonThread.start()
        jdThread.start()
        dangdangThread.join()
        amazonThread.join()
        jdThread.join()
    
    
        closeDB()
    
        print('\n爬取已经结束,即将关闭....')
        os.system('pause')
        
    main()
    


    示例截图:

    关键词:Android下的部分运行结果(以导出至Excel)




    展开全文
  • 采用jsp,struts等技术。界面美观,操作人性化。是本人实习小组获奖作品。内带数据库建表脚本。
  • scrapy_redis分布式爬虫爬取亚马逊图书 最近在学习分布式爬虫,选取当当图书进行了一次小练习 网址,https://www.amazon.cn/gp/book/all_category/ref=sv_b_0 前期准备 安装 redis 数据库,网上由教程请自行谷歌 ...

    scrapy_redis分布式爬虫爬取亚马逊图书

    • 最近在学习分布式爬虫,选取当当图书进行了一次小练习
    • 网址,https://www.amazon.cn/gp/book/all_category/ref=sv_b_0
    • 前期准备
      • 安装 redis 数据库,网上由教程请自行谷歌
      • 安装 Scrapy 和 scrapy-redis
      • pip install scrapy(如果出现问题请自行谷歌解决,需要vc环境)
      • pip install scrapy-redis

    抓取流程

    • 抓取分类页面下的 “每个大分类下的小分类下的列表页的图书部分内容”
    • 在这里插入图片描述

    主要代码

    • settings
    # -*- coding: utf-8 -*-
    
    # Scrapy settings for amazon project
    #
    # For simplicity, this file contains only settings considered important or
    # commonly used. You can find more settings consulting the documentation:
    #
    #     https://doc.scrapy.org/en/latest/topics/settings.html
    #     https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
    #     https://doc.scrapy.org/en/latest/topics/spider-middleware.html
    
    BOT_NAME = 'amazon'
    
    SPIDER_MODULES = ['amazon.spiders']
    NEWSPIDER_MODULE = 'amazon.spiders'
    
    
    # redis组件
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    SCHEDULER_PERSIST = True
    
    ITEM_PIPELINES = {
        'scrapy_redis.pipelines.RedisPipeline': 400,
    }
    
    REDIS_HOST = "127.0.0.1"
    REDIS_PORT = 6379
    REDIS_PARAMS = {
        'password': 'root',
    }
    
    
    # Crawl responsibly by identifying yourself (and your website) on the user-agent
    USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    
    # Obey robots.txt rules
    ROBOTSTXT_OBEY = True
    
    # Configure maximum concurrent requests performed by Scrapy (default: 16)
    #CONCURRENT_REQUESTS = 32
    
    # Configure a delay for requests for the same website (default: 0)
    # See https://doc.scrapy.org/en/latest/topics/settings.html#download-delay
    # See also autothrottle settings and docs
    DOWNLOAD_DELAY = 0.5
    # The download delay setting will honor only one of:
    #CONCURRENT_REQUESTS_PER_DOMAIN = 16
    #CONCURRENT_REQUESTS_PER_IP = 16
    
    # Disable cookies (enabled by default)
    #COOKIES_ENABLED = False
    
    # Disable Telnet Console (enabled by default)
    #TELNETCONSOLE_ENABLED = False
    
    # Override the default request headers:
    #DEFAULT_REQUEST_HEADERS = {
    #   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    #   'Accept-Language': 'en',
    #}
    
    # Enable or disable spider middlewares
    # See https://doc.scrapy.org/en/latest/topics/spider-middleware.html
    #SPIDER_MIDDLEWARES = {
    #    'amazon.middlewares.AmazonSpiderMiddleware': 543,
    #}
    
    # Enable or disable downloader middlewares
    # See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
    #DOWNLOADER_MIDDLEWARES = {
    #    'amazon.middlewares.AmazonDownloaderMiddleware': 543,
    #}
    
    # Enable or disable extensions
    # See https://doc.scrapy.org/en/latest/topics/extensions.html
    #EXTENSIONS = {
    #    'scrapy.extensions.telnet.TelnetConsole': None,
    #}
    
    # Configure item pipelines
    # See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
    #ITEM_PIPELINES = {
    #    'amazon.pipelines.AmazonPipeline': 300,
    #}
    
    # Enable and configure the AutoThrottle extension (disabled by default)
    # See https://doc.scrapy.org/en/latest/topics/autothrottle.html
    #AUTOTHROTTLE_ENABLED = True
    # The initial download delay
    #AUTOTHROTTLE_START_DELAY = 5
    # The maximum download delay to be set in case of high latencies
    #AUTOTHROTTLE_MAX_DELAY = 60
    # The average number of requests Scrapy should be sending in parallel to
    # each remote server
    #AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
    # Enable showing throttling stats for every response received:
    #AUTOTHROTTLE_DEBUG = False
    
    # Enable and configure HTTP caching (disabled by default)
    # See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
    #HTTPCACHE_ENABLED = True
    #HTTPCACHE_EXPIRATION_SECS = 0
    #HTTPCACHE_DIR = 'httpcache'
    #HTTPCACHE_IGNORE_HTTP_CODES = []
    #HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'
    
    
    • spiders
    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy_redis.spiders import RedisSpider
    from copy import deepcopy
    
    
    class BookSpider(RedisSpider):
        name = 'book'
        allowed_domains = ['amazon.cn']
        # start_urls = ['http://amazon.cn/']
        redis_key = "amazon_book"
    
        def parse(self, response):
            div_list = response.xpath('//div[@id="content"]/div[@class="a-row a-size-base"]')
    
            for div in div_list:
                item = {}
    
                item['first_title'] = div.xpath('./div[1]/h5/a/@title').extract_first()
                td_list = div.xpath('./div[2]//td')
    
                for td in td_list:
                    item['second_title'] = td.xpath('./a/@title').extract_first()
                    item['second_url'] = td.xpath('./a/@href').extract_first()
    
                    if item['second_url']:
                    	# 有一个url不完整,所以需要判断一下
                        if "http://www.amazon.cn/" in item['second_url']:
                            yield scrapy.Request(
                                url=item['second_url'],
                                callback=self.parse_book_list,
                                meta={'item': deepcopy(item)}
                            )
    
        def parse_book_list(self, response):
            item = response.meta['item']
    
            li_list = response.xpath('//div[@id="mainResults"]/ul/li')
    
            for li in li_list:
                item['book_name'] = li.xpath('.//div[@class="a-row a-spacing-small"]/div[1]/a/@title').extract_first()
                item['book_author'] = li.xpath('.//div[@class="a-row a-spacing-small"]/div[2]/span/text()').extract()
                item['book_type'] = li.xpath('.//div[@class="a-column a-span7"]/div[@class="a-row a-spacing-none"][1]//text()').extract_first()
                item['book_price'] = li.xpath('.//div[@class="a-column a-span7"]/div[@class="a-row a-spacing-none"][2]/a//text()').extract_first()
    
                print(item)
    
            # 翻页
            next_url = response.xpath('(//a[text()="下一页"]|//a[@title="下一页"])/@href').extract_first()
            if next_url:
                next_url = "https://www.amazon.cn" + next_url
    
                yield scrapy.Request(
                    url=next_url,
                    callback=self.parse_book_list,
                    meta={'item': item}
                )
    
    
    
    • 执行

      • Master端输入 lpush amazon_book "https://www.amazon.cn/gp/book/all_category/ref=sv_b_0"
      • Slaver端输入 scrapy crawl book
    • 部分执行结果

    • 在这里插入图片描述

    小结

    • 亚马逊的网址的html都很有规律性,但是就是这种规律性给xpath提取网页数据带来了一些麻烦。
    • 大部分url都是完整的,但是”Kindle今日特价书“板块的url不是完整的,
    • 感觉使用crawlspider的方法来爬取这个网站可能会更好一些。
    展开全文
  • 探索 Word 2007 开发 II(二):引用 Amazon 图书信息   Written by Allen Lee   引经据典 写文章的时候,我喜欢引经据典,只要有需要,我就会引用曾经看过的图书。然而,和上一回提到的问题类似,每当我...

    探索 Word 2007 开发 II(二):引用 Amazon 图书信息

     

    Written by Allen Lee

     

    引经据典

    文章的时候,我喜欢引经据典,只要有需要,我就会引用曾经看过的图书。然而,和上一回提到的问题类似,每当我要引用一本图书时,我得首先打开浏览器上网搜索一下这本书,接着把这本书的一些基本信息,例如书名和作者,复制到文章里,然后插入这本书的超链接。有没有办法让这个过程变得更加简单呢?如果我没记错的话,Amazon.com提供了搜索图书服务,那么为什么不考虑把它集成进来呢?

    引入一个解决方案的同时会把与之相随的问题也引入来,要成功把Amazon.com的搜索图书服务集成到Word 2007里,我们就得回答下面这些问题:

    1. 访问Amazon.com的搜索图书服务有哪些条件/要求?
    2. 如何向这个服务发送请求?又如何解析服务返回的数据?哪些数据能用到这里来?
    3. 有用的数据如何组织和显示?

     

    寻找经典

    Amazon Web Service提供了两种接口,一种是基于SOAP的,另一种是基于REST的,我将选用后者来完成本回的插件。本回面临的第一个难点就是构建满足需求的REST请求,要做到这点,就得先清楚需求是什么:

    1. 我希望按书名的部分或者全部进行搜索;
    2. 我希望搜索的结果里面包括图书的书名、图书的作者、图书的封面和图书的超链接。
    第二课堂
    Introduction to AWS for C# Developers by Mark Blomsma

    Amazon.com提供了Amazon E-Commerce Service Developer Guide,根据这份文档,我构建了如下所示的REST请求:

    Figure 1 - REST Request

    它告诉Amazon Web Service:

    1. 我要请求的服务是AWSECommerceService,通过它我可以访问Amazon的产品数据库;
    2. 我的访问密钥是什么,它可以通过在Amazon.com上注册帐号获得;
    3. 我要请求的操作是ItemSearch,通过它我可以搜索Amazon的产品数据库;
    4. 我要搜索书名包含"VSTO"字眼的图书。

    在浏览器里执行这个请求将的到如下所示的搜索结果:

    Figure 2 - REST Response

    搜索结果所包含的信息量可以通过ResponseGroup参数来控制,ItemSearch操作使用Small作为该参数的默认值。通过把该参数的值该为Medium可以使返回的搜索结果包含图书的封面:

    Figure 3 - REST Response with Image URLs

    了上面这些准备知识,我就可以着手实现搜索图书这部分功能了。首先,构建REST请求,并通过XElement.Load方法执行之:

    Code 1 - Execute REST Request

    需要注意的是,由于REST请求是一个URL,而书名可以包含URL不允许的字符,于是在把书名加到REST请求之前要先对其进行编码。

    接着,用LINQ to XML对搜索结果进行处理:

    Code 2 - Process REST Response

    其中用到的辅助处理方法有:

    Code 3 - REST Response Process Helpers

    在命令行程序里使用BookSearch.Search方法搜索书名包含"VSTO"字眼的图书:

    Code 4 - Test BookSearch.Search Method

    却抛出了NullReferenceException:

    Figure 4 - Oops! NullReferenceException is Raised

    原来,搜索结果里面有一本书没有图片。由于并非每本书都有图片的,所以图片数据的辅助处理方法应先检查对应的XML元素是否存在,存在则进一步解析并返回图片的地址,否则返回null:

    Code 5 - New Version of GetImageUrl Method

    再次运行Code 4,可以看到正确的结果了:

    Figure 5 - Process Results

     

    列举经典

    知不觉又到设计UI的时候了,由于UI的设计与用户的操作息息相关,于是我们得先看看用户希望怎么操作这个插件:

    1. 点击Ribbon上的Amazon Book按钮打开搜索图书的窗口;
    2. 输入搜索关键字,并点击搜索;
    3. 在搜索结果中选择想要引用的图书;
    4. 插入选中图书的超链接。

    此外,我们还需要进一步细化搜索结果的那些数据将显示在搜索图书窗口里:

    1. 图书的封面;
    2. 图书的完整标题;
    3. 图书的作者列表。

    有了上面这些准备,我们就可以设计搜索图书窗口了。首先,在项目里添加如下所示的窗口:

    Figure 6 - Search Book Window

    这个窗口是使用Component Factory的Krypton Toolkit控件包开发的,里面包含:

    1. 给用户输入书名的编辑框;
    2. 执行搜索的按钮(Go按钮);
    3. 显示搜索结果的ListView控件;
    4. 显示选定图书的书名的Label控件;
    5. 显示选定图书的作者的Label控件;
    6. 插入选定图书的超链接的按钮(Link按钮);
    7. 关闭窗口的按钮(Close按钮)。

    一开始,用户没有在编辑框输入任何东西,而ListView控件也没有显示任何结果,Go按钮和Link按钮应该是屏蔽状态(disable)的。当用户在编辑框了输入了东西,Go按钮会被激活:

    Code 6 - Enable/Disable Go Button

    同理,Link按钮也会在用户选定某本图书后激活:

    Code 7 - Enable/Disable Link Button

    当用户点击Go按钮时,将执行下列操作:

    1. 通过BookSearch.Search方法获取搜索结果;
    2. 构建用于ListView显示图书封面的ImageList对象;
    3. 向ListView填充搜索结果。

    对于第二步,我们需要ImageManager的帮忙:

    Code 8 - ImageManager

    有了它,Go按钮就可以完成它的任务了:

    Code 9 - EventHandler for Click Event of Go Button

    ListView是一个不错的东西,但它不能单独为每个项指定图标,这是我最讨厌的。另外,你也可以对图片进行本地缓存,并让ImageManager在获取图片的时候先查看本地缓存,没有的话再去Amazon.com那里要。

    当用户选定某本图书时,我们需要把它的书名和作者显示在ListView下面的两个Label上,于是我把ListView的SelectedIndexChanged事件委托修改了一下:

    Code 10 - EventHandler for SelectedIndexChanged Event of ListView

    到Ribbon的设计上,我们需要一个按钮来打开搜索图书窗口,为此,我在Ribbon上添加了一个SplitButton,之所以选择它而不是普通的Button,乃因我脑海里一个突如其来的想法,稍后将会为你剖析这个想法的来龙去脉。添加了SplitButton后的Ribbon如下图所示:

    Figure 7 - Amazon Book SplitButton on Ribbon

    然后实现SplitButton的Click事件委托:

    Code 11 - EventHandler for Click Event of Amazon Book SplitButton

    好了,运行插件看看效果:

    Figure 8 - Oops! The Value of ImageUrl is null

    噢,抛了一个ArgumentNullException异常!还记得我是怎么处理ImageUrl吗?在Code 5里,当Amazon Web Service返回的搜索结果里面某本图书没有图片时,BookSearch.GetImageUrl方法返回null,类似地,ImageManager.GetImage方法也应该在遇到这种情况时返回一个"占位图片":

    Code 12 - New Version of GetImage Method

    再次运行插件,可以看到预期的效果了:

    Figure 9 - Search Results

     

    连接经典

    于轮到本回的主角出场了,当用户点击搜索图书窗口的Link按钮时将在当前文档的光标处插入选定图书的超链接:

    Code 13 - EventHandler for Click Event of Link Button

    虽然我现在可以通过搜索图书窗口插入图书的超链接,然而在大多数时候我更愿意遵循以下步骤插入图书的超链接:

    1. 在文档的某个位置输入要插入超链接的图书的书名;
    2. 选中这个书名,使之处于高亮(highlight)状态;
    3. 点击Ribbon上的Amazon Book按钮打开搜索图书的窗口,此时,这个书名显示在编辑框里,而搜索结果则显示在ListView里,并且第一本书处于选中状态;
    4. 如果选定的图书不是我要找的,则在搜索结果里重新选择;
    5. 点击Link按钮插入选定的图书的超链接。

    为此,我需要为搜索窗口添加Load事件委托:

    Code 14 - EventHandler for Load Event of BookSearchView

    由于搜索窗口的Load事件委托和Go按钮的Click事件委托都需要执行搜索操作和向ListView填充搜索结果,所以我把这部分代码提取出来以便重用,这样Go按钮的Click事件委托就可以简化为:

    Code 15 - New Version of Click EventHandler for Go Button

    此时,当我点击Link按钮,原先选中的那个书名将被替换成从Amazon.com获取的完成的书名以及作者的名字,但我希望在原先选中的那个书名的基础上插入超链接并追加作者的名字,于是,我把Link按钮的Click事件委托里为textToDisplay变量赋值的代码改成下面这样:

    Code 16 - Assignment to textToDisplay Variable

     

    幸运经典

    记得在设计Ribbon的时候把Amazon Book按钮设为SplitButton而非普通的Button吗?之所以这样做,是因为我希望为这个插件添加一个比较特别的功能,类似于Google的"手气不错"(I'm Feeling Lucky)。我为Amazon Book按钮的下拉菜单添加了两个(普通)按钮,一个是Amazon Book按钮,另一个是Lucky Book按钮,运行起来像这样:

    Figure 10 - Lucky Book

    其中,下拉菜单里的Amazon Book按钮的效果和Amazon Book主按钮一样,而Lucky Book按钮的效果则和Google的"手气不错"相似。当我在文档的某个位置输入要插入超链接的图书的书名,选中这个书名并点击Lucky Book按钮时,它将会执行基于这个书名的搜索,并插入搜索结果中第一本书的超链接。如果用户在没有选中任何文字的情况下点击Lucky Book按钮或者搜不到指定的图书,则告知用户相关信息。

    Code 17 - Insert Lucky Book

     

    此,Amazon Book插件的开发要告一段落了,虽然我还想实现更加完善的图片管理功能,虽然我还想提供更加丰富的搜索方式,虽然我还想通过配置让插件变得更加灵活,虽然……

    展开全文
  • 目标:抓取亚马逊图书信息, 有图书的名字、封面图片地址、图书url地址、作者、出版社、出版时间、价格、图书所属大分类、图书所属小的分类、分类的url地址 url:...
  • 亚马逊图书刮板 描述 旨在刮擦Amazon HTML页面以获取产品详细信息,并比较数学书籍的书本价格。 我想在没有开销预算的情况下做到这一点,并且对于要尽可能地简单,因此无法使用需要AWS的Amazon 。 当前状态 该代码...
  • 12月10日,亚马逊中国在京发布2015年度图书排行榜,包括“年度图书销售排行榜”“年度畅销图书作家榜”“年度十大新锐作家榜”和“年度阅读 城市榜”四个榜单。手绘涂色书《秘mi花园》成为亚马逊中国2015年度最畅销...
  • 1 准备工作 打开docker,运行splash docker run -p 8050:8050 scrapinghub/splash 确定抓取目标 新建数据库的表 2 建立项目
  • 主要介绍了python爬取亚马逊书籍信息代码分享,具有一定借鉴价值,需要的朋友可以参考下。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,717
精华内容 5,886
关键字:

亚马逊图书