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中的select模块
Apr 23 Python
用Python写王者荣耀刷金币脚本
Dec 21 Python
Python读取Word(.docx)正文信息的方法
Mar 15 Python
python实现杨氏矩阵查找
Mar 02 Python
pyqt5 键盘监听按下enter 就登陆的实例
Jun 25 Python
Python中栈、队列与优先级队列的实现方法
Jun 30 Python
python 实现12bit灰度图像映射到8bit显示的方法
Jul 08 Python
python滑块验证码的破解实现
Nov 10 Python
Python文件操作函数用法实例详解
Dec 24 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
May 18 Python
python dict乱码如何解决
Jun 07 Python
Python3爬虫里关于Splash负载均衡配置详解
Jul 10 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面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
2009/09/30 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
2013/07/01 PHP
深入讲解PHP的Yii框架中的属性(Property)
2016/03/18 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
2016/07/06 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
2020/04/23 PHP
JavaScript window.document的属性、方法和事件小结
2012/10/24 Javascript
Highcharts 非常实用的Javascript统计图demo示例
2013/07/03 Javascript
jQuery实现密保互斥问题解决方案
2013/08/16 Javascript
js制作带有遮罩弹出层实现登录注册表单特效代码分享
2015/09/05 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
使用Angular CLI进行单元测试和E2E测试的方法
2018/03/24 Javascript
vue组件中的样式属性scoped实例详解
2018/10/30 Javascript
JavaScript 防盗链的原理以及破解方法
2020/12/29 Javascript
Python语言的12个基础知识点小结
2014/07/10 Python
Python实现的二维码生成小软件
2014/07/11 Python
让Python代码更快运行的5种方法
2015/06/21 Python
python中defaultdict的用法详解
2017/06/07 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
python golang中grpc 使用示例代码详解
2020/06/03 Python
五款漂亮的纯CSS3动画按钮的实例教程
2014/11/21 HTML / CSS
澳大利亚波西米亚风连衣裙在线商店:Fortunate One
2019/04/01 全球购物
Ariat英国官网:为世界顶级马术运动员制造最优质的鞋类和服装
2020/02/14 全球购物
解决python 输出到csv 出现多空行的情况
2021/03/24 Python
办公室主任职责范文
2013/11/08 职场文书
工厂门卫岗位职责
2013/11/25 职场文书
竞选演讲稿范文
2013/12/28 职场文书
开水果连锁店创业计划书
2013/12/29 职场文书
四议两公开实施方案
2014/03/28 职场文书
《春笋》教学反思
2014/04/15 职场文书
离婚案件答辩状
2015/05/22 职场文书
小学英语教学随笔
2015/08/14 职场文书
redis中lua脚本使用教程
2021/11/01 Redis
日本动漫十大公认神作:第五现已全网禁播,《死亡笔记》在榜
2022/03/18 日漫
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python