您好,欢迎访问洪震南博客!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧
  • 网站所有资源均来自网络,如有侵权请联系站长删除!

少女时代mv合辑爬虫练习豆瓣读书-钟胖胖的记事本

全部文章 admin 2018-12-31 389 次浏览
网站分享代码
爬虫练习豆瓣读书-钟胖胖的记事本
昨晚使用不熟悉的xpath语法解析百度新闻页面碰到了好多坑,今天继续通过简单的豆瓣图书进行练习
1.分析页面

进入豆瓣首页https://www.douban.com/在第一行导航栏找到读书:https://book.douban.com/
进入页面之后发现有很多内容,伯恩安德森由于豆瓣没有反爬措施,所以多抓取些数据
大致浏览后发现应该能通过标签查找到全部图书,找到所有热门标签点击所有热门标签https://book.douban.com/tag/?view=cloud


浏览页面后大致可以确定这个入口是合适的一个入口
2.分析入口页面
打开浏览器自带的开发者模式找到其中一个标签:小说
1<td><a href="/tag/小说">小说</a>
点击小说:https://book.douban.com/tag/小说发现它的url就是域名https://book.douban.com/和/tag/小说的组合
3.分析tag页面
进入小说页面之后发现一本书大概分为8个关键部分:封面,书名,作者,出版社,日期勋晶 ,售价,评分,简介
1<img class="" data-echo="https://img3.doubanio.com/mpic/s27264181.jpg" width="90"> 2 3<ahref="https://book.douban.com/subject/25862578/" title="解忧杂货店"onclick="...">解忧杂货店</a> 4 5<div class="pub">[日] 东野圭吾 / 李盈春 / 南海出版公司 / 2014-5 / 39.50元</div> 6 7<span class="rating_nums">8.6</span> 8 9<p>现代人内心流失的东西,这家杂货店能帮你找回——僻静的街道旁有一家杂货店,10只要写下烦恼投进卷帘门的投信口,第二天就会在店后的牛奶箱里得到回答。11因男友身患绝... </p>
4.开始
首先导入需要的库
1from lxml import etree2import requests
这次使用类的方式实现
1class DouBanBook():2 pass
初始化类:
1def __init__(self):2self.url_book = 'https://book.douban.com/tag/狼爱上羊简谱?少女时代mv合辑view=cloud'3self.page = 0
获取tag列表
1def get_tags(self): 2''' 3获取tag列表 4''' 5tags = [] #创建一个空列表存储tag名 6result = requests.get(self.url_book).text 7#开始xpath解析 8html = etree.HTML(result) 9tags_list = html.xpath('//[@id="content"]/div/div[1]/div[2]/div/table/tbody/tr/td/a')10for tag in tags_list:11 tags.append(''.join(tag.xpath('./text()')))12return tags
由于数据比较大且有分析价值,对数据进行持久化操作(存入数据库)使用python操作mysql数据库
首先新建如下库和表


1def insert_mysql(self星云物语 ,item): 2 #连接数据库 3 db = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='douban'柴刀女,charset="utf8") 4 #写sql语句 5 sql = "INSERT INTO douban_book 6(tag,pic,titiel,author,press,price,time,score,book_info) 7VALUES (%s,%s,%s风声后传,%s筱声咪 ,%s,%s,%s何广位,%s,%s);" 8 #尝试插入数据 9 try:10with db.cursor() as cursor:#创建游标11 cursor.execute(sql, (item['tag']李珉延,item['book_pic']张金莹 ,item['book_titiel'],item['book_author']12,item['book_press'],item['book_price'],item['book_time']罗妹妹,13item['book_score'],item['book_info']))14 db.commit()#提交数据15 except Exception as e:#如果出现异常插入11书名11111116cursor.execute(sql,('1','1',item['book_titiel'],'1','1','1','1'浜尾京介 ,'1'窦唯烧车,'1',))17db.commit()
将八项重要内容写入数据库
1def get_book_message(self,tag): 2''' 3将八项重要信息存储到mysql数据库 4''' 5#拼接tag和page成新的url 6url = 'https://book.douban.com/tag/'+tag+'抗战铁军 ?start=%d&type=T' %self.page 7result = requests.get(url).text 8#开始xpath解析 9html = etree.HTML(result)10books_list = html.xpath('//*[@id="subject_list"]/ul/li')11#由于翻页操作是通过回调函数实现,所以需要做跳出循环的判断12if books_list == []:13 return14item = {}#新建一个空字典存储获取到的信息15item['tag'] = tag16for book in books_list:17 #封面18 item['book_pic'] = ''.join(book.xpath('./div[1]/a/img/@src'))19 #书名20 item['book_titiel'] = ''.join(book.xpath('./div[2]/h2/a/@title'))2122 _book_press = book.xpath('./div[2]/div[1]/text()')[0].split(' ')23 #由于作者,出版社高靖榕 ,时间,售价是通过/分割的所以写一个列表推倒式存储24 book_press = ''.join([book_press for book_press in _book_press if '/' in book_press])25 #作者/出版社/时间/售价26 #查看多条数据后发现最后一条必为价格,最后第二条为时间郭雪姣 ,最后第三条为出版社27 item['book_price'] = book_press.split('/')[-1]28 item['book_time'] = book_press.split('/')[-2]29 item['book_press'] = book_press.split('/')[-3]30 item['book_author'] = ''.join(book_press.split('/')[:-3])31 #评分32 item['book_score'] = ''.join(book.xpath('./div[2]/div[2]/span[2]/text()'))33 #简介34 item['book_info'] = ''.join(''.join(book.xpath('./div[2]/p/text()')).split(' '))35 self.insert_mysql(item)#写入数据库36 #print(item)37self.page += 2038self.get_book_message(tag)
整个类:
1 class DouBanBook(): 2 def __init__(self): 3self.url_book = 'https://book.douban.com/tag/?view=cloud' 4self.page = 0 5 def get_tags(self): 6''' 7获取tag列表 8''' 9tags = [] #创建一个空列表存储tag名10result = requests.get(self.url_book).text11#开始xpath解析12html = etree.HTML(result)13tags_list = html.xpath('//[@id="content"]/div/div[1]/div[2]/div/table/tbody/tr/td/a')14for tag in tags_list:15 tags.append(''.join(tag.xpath('./text()')))16return tags1718 def get_book_message(self,tag):19'''20将八项重要信息存储到mysql数据库21'''22#拼接tag和page成新的url23url = 'https://book.douban.com/tag/'+tag+'?start=%d&type=T' %self.page24result = requests.get(url).text25#开始xpath解析26html = etree.HTML(result)27books_list = html.xpath('//*[@id="subject_list"]/ul/li')28#由于翻页操作是通过回调函数实现,所以需要做跳出循环的判断29if books_list == []:30 return31item = {}#新建一个空字典存储获取到的信息32item['tag'] = tag33for book in books_list:34 #封面35 item['book_pic'] = ''.join(book.xpath('./div[1]/a/img/@src'))36 #书名37 item['book_titiel'] = ''.join(book.xpath('./div[2]/h2/a/@title'))3839 _book_press = book.xpath('./div[2]/div[1]/text()')[0].split(' ')40 #由于作者,出版社,时间,售价是通过/分割的所以写一个列表推倒式存储41 book_press = ''.join([book_press for book_press in _book_press if '/' in book_press])42 #作者/出版社/时间/售价43 #查看多条数据后发现最后一条必为价格,最后第二条为时间,最后第三条为出版社44 item['book_price'] = book_press.split('/')[-1]45 item['book_time'] = book_press.split('/')[-2]46 item['book_press'] = book_press.split('/')[-3]47 item['book_author'] = ''.join(book_press.split('/')[:-3])48 #评分49 item['book_score'] = ''.join(book.xpath('./div[2]/div[2]/span[2]/text()'))50 #简介51 item['book_info'] = ''.join(''.join(book.xpath('./div[2]/p/text()')).split(' '))52 self.insert_mysql(item)#写入数据库53 #print(item)54self.page += 2055self.get_book_message(tag)5657 def insert_mysql(self,item):58 #连接数据库59 db = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='douban',charset="utf8")60 #写sql语句61 sql = "INSERT INTO douban_book62(tag萧百成 ,pic,titiel,author,press徐华凤,price,time,score,book_info) 63VALUES (%s,%s异界修仙成圣 ,%s,%s,%s,%s,%s,%s,%s);"64 #尝试插入数据65 try:66with db.cursor() as cursor:#创建游标67 cursor.execute(sql, (item['tag'],item['book_pic'],item['book_titiel'],item['book_author']68,item['book_press'],item['book_price'],item['book_time'],69item['book_score'],item['book_info']))70 db.commit()#提交数据71 except Exception as e:#如果出现异常插入11书名11111172cursor.execute(sql,('1','1',item['book_titiel'],'1','1','1','1','1','1',))73db.commit()
开始调用:
由于全部图书有点多,使用线程池加快点速度并记录下耗时
耗时1021s,相当于17分钟速度还有待提升
1if __name__ == '__main__': 2 starttime = time.time() 3 book = DouBanBook() 4 p = Pool() 5 for tag in book.get_tags(): 6 p.apply_async(book.get_book_message,args=(tag,)) 7 8 p.close() 9 p.join()10 usetime = time.time()-starttime11 print('总耗时%s'%usetime)

综上总共导入的模块如下:
1from multiprocessing import Pool #进程池2from lxml import etree #lxml解析页面3import pymysql #连接mysql数据库了4import requests #模拟http/https访问5import time #时间模块