Python 50行爬虫抓取并处理图灵书目过程详解
前言
使用requests进行爬取、BeautifulSoup进行数据提取。
主要分成两步:第一步是解析图书列表页,并解析出里面的图书详情页链接。第二步是解析图书详情页,提取出感兴趣的内容,本例中根据不同的数据情况,采用了不同的提取方法,总的感觉就是BeautifulSoup用起来很方便
以下是几个典型HTML内容提取的Python代码片段
1、提取详情页链接
列表页中的详情页链接片段
深度学习入门:基于Python的理论与实现
提取详情页链接的Python代码
#bs是BeautifulSoup的instance bs.select('.name') for详情链接信息inbs.select('.name'): #提取出链接 print(详情链接信息.a.get('href'))
2、提取详情页中的图书名称
详情页中图书名称HTML代码
深度学习入门:基于Python的理论与实现
提取图书名称的Python代码
#因为提取出来的文字前后还带了很多空格,所以要用strip去掉 bs.h2.get_text().strip()
3、提取电子书价格信息
详情页中电子书价格HTML代码
提取电子书价格的Python代码
#因为不是每本书都有电子书,所以要判断一下 有电子书=bs.find("dt",text="电子书") if有电子书: 价格=有电子书.next_sibling.next_sibling.find("span",{"class":"price"}).get_text().strip()[1:] print(float(价格))
完整代码
#ituring.py,python3版本,默认只抓两页,可以通过启动参数控制要抓的列表页范围 importsys importrequests importtime frombs4importBeautifulSoup def输出图书列表中的详情链接(bs): #找到页面中所有的... for详情链接信息inbs.select('.name'): #提取出链接 yield详情链接信息.a.get('href') def获取图书详情(链接): 详情页=requests.get('http://www.ituring.com.cn%s'%链接) if详情页.ok: bs=BeautifulSoup(详情页.content,features="html.parser") 图书={} 图书['title']=bs.h2.get_text().strip() 图书['status']=bs.find("strong",text="出版状态").next_sibling 有定价=bs.find("strong",text="定价") if有定价: 图书['price']=有定价.next_sibling 有电子书=bs.find("dt",text="电子书") if有电子书: 图书['ePrice']=float(有电子书.next_sibling.next_sibling.find("span",{"class":"price"}).get_text().strip()[1:]) 有出版日期=bs.find("strong",text="出版日期") if有出版日期: 图书['date']=有出版日期.next_sibling 图书['tags']=[] fortaginbs.select('.post-tag'): 图书['tags'].append(tag.string) return图书 else: print('❌详情页http://www.ituring.com.cn%s'%链接) def解析图书列表页(起始页,终止页): for页序号inrange(起始页-1,终止页): #逐一访问图书列表页面 列表页=requests.get('http://www.ituring.com.cn/book?tab=book&sort=new&page=%s'%页序号) if列表页.ok: #创建BeautifulSoup的instance bs=BeautifulSoup(列表页.content,features="html.parser") #提取列表页中的详情页链接,并逐一分析 for详情页面链接in输出图书列表中的详情链接(bs): 图书信息=获取图书详情(详情页面链接) #得到的图书信息,按照自己的需求去处理吧 print(图书信息) #抓完一本书休息一下 time.sleep(0.1) print('✅第%s页获取完毕\n\t'%(页序号+1)) else: print('❌第%s页获取出错\n\t'%(页序号+1)) if__name__=='__main__': #默认图书列表起始页和终止页 起始图书列表页码=1 终止图书列表页码=2#⚠️改改代码页可以实现自动获得最后一页 #获取输入参数;⚠️此处未对输入参数的类型做检测 if(len(sys.argv)==2): #只有一个参数时,输入的是终止页码,起始页码默认为0 终止图书列表页码=int(sys.argv[1]) if(len(sys.argv)==3): #有两个参数时,第一个参数是起始页码,第二个参数是终止页码 起始图书列表页码=int(sys.argv[1]) 终止图书列表页码=int(sys.argv[2]) 解析图书列表页(起始图书列表页码,终止图书列表页码)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。