爬虫过程:
源文件:
1. bookid_bookname_zz.txt,存储为dict类型bookNmaes。
<bookId,”bookname+zz”>
2. url_root为亚马逊某本书的搜索界面。
程序:
1.使用的第三方库:
BeautifulSoup,Urllib2, selenium.webdriver, re
2. Webdriver的phantomJS可视化爬虫过程,进行调试。
3.
4. Crawl为主函数也即调度端,crawl(driver, url_root, bookNames)
5. 给网页下载器(download_amazon)传入:
download_amazon(driver, url_root, bookId, bookNames)
a. 传入bookId是为了获取dict类型中的书名及作者,作为检索的关键词
b. 根据亚马逊页面特征,每个书籍检索页面的按钮有固定的id,根据driver的find_element_by_id获取检索按钮,这样可以触发检索操作。Id:”twotabsearchtextbox”
c. 由于亚马逊检索框有限定长度,超过限定长度后(40-50串长)的时候,会返回一个空页面(估计认为是恶性行为了..),而图书馆记录的书名和作者有时候会过长,而我们一般可能用一个作者名加书名就可以确定一本书,因此做了一个简单的处理,截取字符串的前39串长,这样保证不会返回空页面。
d. 使用send_keys方法填充检索词,按钮的submit触发检索事件。
e. 使用driver.page_source返回当前返回页面的源码。
6. 给网页解析器(imgparse_amazon)传入:
imgparse_amazon(html_string,bookId,bookNames),其中html_string是网页下载器下载下来的网页源码。
a. 我们的目的是获取图片并进行下载到本地,然后将本地存放图片的目录搭建图片服务器,为界面展示进行服务。
b. BeautifulSoup用来解析当前网页源码,我们的目的是获取图片的url,这样便可以直接进行访问该url下载。
c. 先定位到亚马逊返回的搜索列表:soup.find('ul',attrs={"id":r"s-results-list-atf"})
d. 如果该列表为空,说明没有检索到,则返回url为空
e. 由于亚马逊的搜索功能已经提供最相近的结果,所以我们返回当前搜索列表中的第一个结果的图片url.(之前有做解析字符串,提取出版社,根据出版社是否一致进行筛选,因为有时候图书馆的出版社空缺或者网站出版社空缺,同时字符串有时候存储的不当,如果严格控制相等,反而取得不好的效果,后舍弃。)
7.以urllib2.urlopen打开返回的Url,以二进制形式将图片存入指定目录,图片为bookId,不能为书名,因为书名可能重复。