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 相关文章推荐
centos 下面安装python2.7 +pip +mysqld
Nov 18 Python
Python编程中归并排序算法的实现步骤详解
May 04 Python
Python 3.x 连接数据库示例(pymysql 方式)
Jan 19 Python
Python使用smtp和pop简单收发邮件完整实例
Jan 09 Python
Django中Forms的使用代码解析
Feb 10 Python
Python实现输出某区间范围内全部素数的方法
May 02 Python
python绘制规则网络图形实例
Dec 09 Python
安装PyInstaller失败问题解决
Dec 14 Python
如何使用pandas读取txt文件中指定的列(有无标题)
Mar 05 Python
Python如何读取、写入JSON数据
Jul 28 Python
python not运算符的实例用法
Jun 30 Python
python和C/C++混合编程之使用ctypes调用 C/C++的dll
Apr 29 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实现Socket服务器的代码
2008/04/03 PHP
PHP 编程的 5个良好习惯
2009/02/20 PHP
PHP中定义数组常量(array常量)的方法
2014/11/17 PHP
PHPCMS2008广告模板SQL注入漏洞修复
2016/10/11 PHP
Laravel 实现数据软删除功能
2019/08/21 PHP
解放web程序员的输入验证
2006/10/06 Javascript
Firefox和IE浏览器兼容JS脚本写法小结
2008/07/07 Javascript
全面理解面向对象的 JavaScript(来自ibm)
2013/11/10 Javascript
JavaScript实现列出数组中最长的连续数
2014/12/29 Javascript
javascript的switch用法注意事项分析
2015/02/02 Javascript
jQuery常用知识点总结以及平时封装常用函数
2016/02/23 Javascript
js控件Kindeditor实现图片自动上传功能
2020/07/20 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
BootStrap selectpicker后台动态绑定数据
2017/06/01 Javascript
JS+CSS实现网页加载中的动画效果
2017/10/27 Javascript
记一次webpack3升级webpack4的踩坑经历
2018/06/12 Javascript
Vuex 在Vue 组件中获得Vuex 状态state的方法
2018/08/27 Javascript
vue element动态渲染、移除表单并添加验证的实现
2019/01/16 Javascript
nodejs检测因特网是否断开的解决方案
2019/04/17 NodeJs
jQuery提示框插件SweetAlert用法分析
2019/08/05 jQuery
JS面向对象编程实现的拖拽功能案例详解
2020/03/03 Javascript
基于JavaScript实现猜数字游戏代码实例
2020/07/30 Javascript
swiper实现导航滚动效果
2020/12/13 Javascript
简单介绍Python下自己编写web框架的一些要点
2015/04/29 Python
Python实现的中国剩余定理算法示例
2017/08/05 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
2020/11/26 Python
python实现xml转json文件的示例代码
2020/12/30 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
2021/01/28 Python
DC Shoes荷兰官方网站:美国极限运动品牌
2019/10/22 全球购物
人力资源主管岗位职责
2014/01/29 职场文书
党的群众路线教育实践活动公开承诺书
2014/03/28 职场文书
工程负责人任命书
2014/06/06 职场文书
幼儿园食品安全责任书
2015/05/08 职场文书
大学生奖学金获奖感言(范文)
2019/08/15 职场文书
Java实现多线程聊天室
2021/06/26 Java/Android