selenium+PhantomJS爬取豆瓣读书


Posted in Python onAugust 26, 2019

本文实例为大家分享了selenium+PhantomJS爬取豆瓣读书的具体代码,供大家参考,具体内容如下

获取关于Python的全部书籍信息;
通过代码测试 request携带‘User-Agent'及 ‘data'数据信息的方式均无法获取到相关信息,获取数据时,部分数据为空,导致获取过程中报错,无法获取全部数据,初步判定豆瓣读书的反爬机制较为严格;通过selenium 模拟浏览器请求的方法测试后发现,可利用 selenium 方法请求获取数据;

#导入需要的模块
from selenium import webdriver
import time
from lxml import etree
import pymysql
import re

#创建一个函数
def my_browers(url, page):

  # 获取浏览器对象
  browers = webdriver.PhantomJS(executable_path=r'd:\Desktop\pythonjs\phantomjs-2.1.1-windows\bin\phantomjs.exe')
  
  # 用浏览器发起请求
  browers.get(url)
  
  #休息两秒,频率低一点,爬的时间久一点,安全就多一点
  time.sleep(2)
  
   # 获取页面信息
  html = browers.page_source
  
  # 调用页面解析函数
  parse_html(html)
  
# 解析页面信息
def parse_html(html):

  # 生成一个xpath对象
  html = etree.HTML(html)

  # 获取所有的书籍信息列表
  books = html.xpath('//div[contains(@class,"sc-bZQynM")]')

  # 遍历每一本书籍 然后拿到我们想要的数据
  for book in books:
    # 创建一个存书字典存数据用
    book_dict = {}

    # 获取封面信息
    pic = book.xpath('//img/@src')
    if pic:
      book_dict['pic'] = pic[0]
    else:
      book_dict['pic'] = ''
    # print(pic)

    # 获取书名
    book_name = book.xpath('//div[@class="title"]/a/text()')
    # print(book_name)
    if book_name:
      book_name = book_name[0]
      # 删除书名中最后出现的引号,
      #由于存数据库的时候书名最后面的引号会导致数据库报错,删除可以使代码更健壮
      if '"' in book_name:
        pattern = re.compile(r'"')
        book_name = pattern.sub('', book_name)
      if "'" in book_name:
        pattern = re.compile(r"'")
        book_name = pattern.sub('', book_name)
        # 删除书名中最后出现的\,存数据的时候书名最后的\会把sql语句最后的引号转义,
        #删除可以使代码更健壮
      if '\\' in book_name:
        book_name = book_name[:-1]
      book_dict['book_name'] = book_name
    else:
      book_dict['book_name'] = ''

    # 获取书籍详情连接
    book_url = book.xpath('//div[@class="title"]/a/@href')
    if book_url:
      book_dict['book_url'] = book_url[0]
    else:
      book_dict['book_url'] = ''

    # 获取评分信息
    score_book = book.xpath('//span[@class="rating_nums"]/text()')
    if score_book:
      book_dict['score_book'] = score_book[0]
    else:
      book_dict['score_book'] = ''

    # 获取出版社信息
    book_detail = book.xpath('//div[@class="meta abstract"]/text()')
    if book_detail:
      # 删除书详情中最后出现的引号;
      book_detail = book_detail[0]
      if "'" in book_detail:
        pattern = re.compile(r"'")
        book_detail = pattern.sub('', book_detail)

      book_dict['book_detail'] = book_detail
    else:
      book_dict['book_detail'] = ''
    print(book_dict)

    # 调用数据库函数
    insert_mysql(book_dict)

# 插入数据库
def insert_mysql(book_dict):
  # 连接数据库
  conn = pymysql.connect('localhost', 'root', 'root', 'test', charset='utf8')

  # 创建操作数据库的对象
  cursor = conn.cursor()

  pic = book_dict['pic']
  book_name = book_dict['book_name']
  book_url = book_dict['book_url']
  score = book_dict['score_book']
  book_detail = book_dict['book_detail']

  sql = f"insert into python_book (pic,book_name,book_url,score,book_detail) " \
     f"VALUE ('{pic}','{book_name}','{book_url}','{score}','{book_detail}')"

  # 执行并提交
  cursor.execute(sql)
  conn.commit()


if __name__ == '__main__':
  for i in range(0, 199):
    print('=================下载第{}页========================'.format(i + 1))
    page = i * 15
    base_url = 'https://book.douban.com/subject_search?search_text=python&cat=1001&start={}'.format(page)
    my_browers(base_url, page)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中实现对list做减法操作介绍
Jan 09 Python
Python实现excel转sqlite的方法
Jul 17 Python
python中Switch/Case实现的示例代码
Nov 09 Python
python编程实现12306的一个小爬虫实例
Dec 27 Python
Python爬虫框架Scrapy实例代码
Mar 04 Python
Python实现自定义顺序、排列写入数据到Excel的方法
Apr 23 Python
python获取本机所有IP地址的方法
Dec 26 Python
python连接PostgreSQL数据库的过程详解
Sep 18 Python
Python 如何创建一个线程池
Jul 28 Python
Django-silk性能测试工具安装及使用解析
Nov 28 Python
python基于socket模拟实现ssh远程执行命令
Dec 05 Python
看看如何用Python绘制小米新版天价logo
Apr 20 Python
python多任务之协程的使用详解
Aug 26 #Python
python数组循环处理方法
Aug 26 #Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
Aug 26 #Python
关于Python中的向量相加和numpy中的向量相加效率对比
Aug 26 #Python
python中sort和sorted排序的实例方法
Aug 26 #Python
对Python 中矩阵或者数组相减的法则详解
Aug 26 #Python
Numpy 中的矩阵求逆实例
Aug 26 #Python
You might like
通用PHP动态生成静态HTML网页的代码
2010/03/04 PHP
用PHP来计算某个目录大小的方法
2014/04/01 PHP
PHP三元运算的2种写法代码实例
2014/05/12 PHP
详解php语言最牛掰的Laravel框架
2017/11/20 PHP
JavaScript延迟加载
2021/03/09 Javascript
理解JavaScript的caller,callee,call,apply
2009/04/28 Javascript
jquery自定义属性(类型/属性值)
2013/05/21 Javascript
js控制input输入字符解析
2013/12/27 Javascript
css+js实现部分区域高亮可编辑遮罩层
2014/03/04 Javascript
jQuery自定义滚动条完整实例
2016/01/08 Javascript
JS获取IMG图片高宽的简单实例
2016/05/17 Javascript
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
利用jsonp与代理服务器方案解决跨域问题
2017/09/14 Javascript
一份超级详细的Vue-cli3.0使用教程【推荐】
2018/11/15 Javascript
jQuery使用bind动态绑定事件无效的处理方法
2018/12/11 jQuery
详解小程序退出页面时清除定时器
2019/04/28 Javascript
使用JQuery自动完成插件Auto Complete详解
2019/06/18 jQuery
[10:34]DOTA2上海特级锦标赛全纪录
2016/03/25 DOTA
[51:14]LGD vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
采用Psyco实现python执行速度提高到与编译语言一样的水平
2014/10/11 Python
Python实现将xml导入至excel
2015/11/20 Python
Linux下Python安装完成后使用pip命令的详细教程
2018/11/22 Python
python 去除二维数组/二维列表中的重复行方法
2019/01/23 Python
python在回调函数中获取返回值的方法
2019/02/22 Python
tensorflow下的图片标准化函数per_image_standardization用法
2020/06/30 Python
详解CSS3选择器的使用方法汇总
2015/11/24 HTML / CSS
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
日本乐天官方海外转运服务:Rakuten Global Express
2018/11/30 全球购物
校庆标语集锦
2014/06/25 职场文书
酒店七夕情人节活动策划方案
2014/08/24 职场文书
小学生推普周国旗下讲话稿
2014/09/21 职场文书
卫生保健工作总结2015
2015/05/18 职场文书
2015年小班保育员工作总结
2015/05/27 职场文书
导师鉴定意见
2015/06/05 职场文书
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js