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 与GO中操作slice,list的方式实例代码
Mar 20 Python
Python编程把二叉树打印成多行代码
Jan 04 Python
tensorflow 获取模型所有参数总和数量的方法
Jun 14 Python
对python requests发送json格式数据的实例详解
Dec 19 Python
python 的 scapy库,实现网卡收发包的例子
Jul 23 Python
python3.7环境下安装Anaconda的教程图解
Sep 10 Python
Python 获取项目根路径的代码
Sep 27 Python
Python实现bilibili时间长度查询的示例代码
Jan 14 Python
Python request操作步骤及代码实例
Apr 13 Python
Tensorflow全局设置可见GPU编号操作
Jun 30 Python
利用keras使用神经网络预测销量操作
Jul 07 Python
Django debug为True时,css加载失败的解决方案
Apr 24 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对二维数组进行排序的简单实例
2013/12/19 PHP
PHP创建桌面快捷方式的实例代码
2014/02/17 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
2014/07/25 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
2017/04/07 PHP
php实现网页上一页下一页翻页过程详解
2019/06/28 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
thinkphp诸多限制条件下如何getshell详解
2020/12/09 PHP
日期 时间js控件
2009/05/07 Javascript
Jquery+WebService 校验账号是否已被注册的代码
2010/07/12 Javascript
JQuery小知识
2010/10/15 Javascript
jQuery中animate动画第二次点击事件没反应
2015/05/07 Javascript
js实现页面a向页面b传参的方法
2016/05/29 Javascript
jQuery.uploadify文件上传组件实例讲解
2016/09/23 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
微信小程序 UI与容器组件总结
2017/02/21 Javascript
jquery与js实现全选功能的区别
2017/06/11 jQuery
基于iScroll实现下拉刷新和上滑加载效果
2017/07/18 Javascript
Vue路由钩子之afterEach beforeEach的区别详解
2018/07/15 Javascript
Angular(5.2->6.1)升级小结
2018/12/27 Javascript
关于layui的动态图标不显示的解决方法
2019/09/04 Javascript
浅谈vue项目,访问路径#号的问题
2020/08/14 Javascript
vue 单页应用和多页应用的优劣
2020/10/22 Javascript
Pycharm远程调试openstack的方法
2017/11/21 Python
计算机二级python学习教程(3) python语言基本数据类型
2019/05/16 Python
Django静态资源部署404问题解决方案
2020/05/11 Python
Python3 用matplotlib绘制sigmoid函数的案例
2020/12/11 Python
python Pexpect模块的使用
2020/12/25 Python
一份比较全的PHP面试题
2016/07/29 面试题
六年级学生期末评语
2014/12/26 职场文书
导游欢迎词范文
2015/01/23 职场文书
2015年学校食堂工作总结
2015/04/22 职场文书
借款民事起诉状范文
2015/05/19 职场文书
企业法人任命书
2015/09/21 职场文书