引言
我写的这个爬虫非常的简单,没有什么难的逻辑思维,只是简单运用BeautifulSoup进行爬取,相信初学者都可以看懂,就是代码写的比较乱,因为我也是初学者。。。。可能你没有耐心看完,我会尽量一部分一部分地分开讲解,尽量让大家看起来不会觉得脑袋大,只要你带着一种这个文章很简单很容易懂的潜意识去阅读,那你一定能够轻松看懂的,不要被还没开始便畏难的潜意识所打败。
需要准备的库以及网页链接:
requests
BeautifulSoup
random
re
https://www.amazon.cn/gp/book/all_category/ref=sv_b_1
requests库主要是用于发送网络请求
BeautifulSoup库我用的最多,用于匹配我需要的数据
random库没有什么用处,只是为了防止爬取亚马逊网页的时候被反爬虫,所以弄了一个随机获取请求头的方法
re库在这次实验中很少一部分用到了它,主要是用于爬取一些数据,但是也算是给我涨了一点新知识,因为大部分同学都说正则表达式来匹配数据比BeautifulSoup更简单
关于相关库的介绍我就不啰嗦了,相信大家只要一百度都可以找到,而且这些库都说爬虫基础的,没有什么安装困难
最后的一个链接便是我使用的亚马逊书城的链接
我想实现的功能
- 实现一级、二级目录的展示,目录是根据书籍类型分类的,由一级大目录到二级目录再到准确的书籍
- 由目录找到书籍列表,并且把当前页展示的书籍的简单介绍信息排列出来同时进行编号,如果当前页有副页,则可以实现页码的翻页
- 在停止翻页后会进行确切一本书的查找,用户只需要输入上面排列出的书籍中对应的编号就可以查看那本书的相关信息(包括书名、作者、出版社、书籍编码、评论等)
- 同时还会在书籍详细介绍中显示出书籍的星级评论百分比分布以及其对应的前十条相关评论(有的评论上百条,所以这里没有进行翻页处理,只读取当前评论第一页的内容)。
代码的主要框架展示
虽然我的命名不是很规范,但是相信大家根据我的中文注释也大概知道了每个方法执行者怎么样的操作,接下来我便会跟大家慢慢讲解我的代码中一些实现的细节部分。
代码讲解部分
randHeader
部分我就不讲太多了,相信只要大家需要什么样的请求头,直接百度都可以出现。outPrintMessage
这个方法也没事什么可将的,只是用于输出一些提示信息,把不重要的部分从主要代码中提取出来另外分装,让主要的代码看起来没有那么冗长
#打印出菜单
def outPrinMessage(num):
if num == 1:
print("+-----------------+")
print("+ +")
print("+ 欢迎光临亚马逊书城 +")
print("+ +")
print("+-----------------+")
getHtmlText
这是方法是用于请求网页以后,返回一个text文本。r.raise_for_status()
作用在于,当我们发出一个错误的请求的时候,这句代码会给我们抛出一个异常。这个方法也是简单到不行,我相信大家一定可以看懂。
#获取请求后的网页内容
def getHtmlText(url):
headers = randHeader()
try:
r = requests.get(url, headers = headers, timeout=30)#获取连接并设置了连接的超时时间为30秒
r.raise_for_status()
r.encoding = 'utf-8'
return r.text
except:
return '请检查网络是否连接成功'
findAllItems(soup)
用于查找并列出一级目录,同时找到一级目录下对应的二级目录分类以及url地址,方便后期的跳转网页请求
分析: 我们可以清晰看到原网页上面,我想要的一级目录和二级目录是在同一页上面,左边的一个一级目录对应着右边的一个一级目录,因此我们需要同时获取一级目录和耳机目录以及二级目录对应的每个url地址,那我们应该怎么做呢?
我们可以定义一个list(itemName)来保存一级目录,然后在定义一个list(tableItem)来保存二级目录,不过保存二级目录的那个list里面所存的元素是一个字典,因为我们需要同时保存二级目录的目录名以及url地址。并且通过这样的保存,我们可以把一级目录的下标与耳机目录的下标对应起来,这样输入一级目录的时候,我们就可以很方便得找到当前类型下所有的二级目录。
largeItem用于查找到一级目录列表
littleItem用于查找装载二级目录的那个范围框
for i in littleItem:
dic = {}
iUrl = i.find_all('a', attrs={'class': 'a-link-nav-icon'})
for j in iUrl:
name = j.get("title") # 查找到大分类里面的小分类名称
url = j.get('href') # 查找到小分类的地址
dic[name] = url
tableItem.append(dic)
iUrl是用于找到装载了二级目录的范围框内所有的二级目录。
if largeItem != None:
print(" |", end=" ")
for item in largeItem:
div = item.find('a').get('title')
itemsName.append(div)
print(div, end=" | ")
print("\n")
return itemsName, tableItem
return None, None
得到一级目录的名称,然后打印出来,实现的效果如下
findUrl(strType,largeItem,items)
找到用户输入二级目录类型后对应的网页信息输入的strType是在一级目录里面进行查找,查找到对应的类型后再找出二级目录的目录列表,如果没有查找到会提醒用户重新输入,在代码的第一个for循环里面便是执行这样的操作
二级列表打印在输出栏后要求用户再次进行书籍