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 基础学习教程
Feb 08 Python
Python操作Mysql实例代码教程在线版(查询手册)
Feb 18 Python
python连接MySQL、MongoDB、Redis、memcache等数据库的方法
Nov 15 Python
Python单例模式实例分析
Jan 14 Python
Python os模块学习笔记
Jun 21 Python
Python编程实现双击更新所有已安装python模块的方法
Jun 05 Python
python下载图片实现方法(超简单)
Jul 21 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
May 24 Python
python 字典中文key处理,读取,比较方法
Jul 06 Python
Python绘制KS曲线的实现方法
Aug 13 Python
解决python3运行selenium下HTMLTestRunner报错的问题
Dec 27 Python
Python编程实现tail-n查看日志文件的方法
Jul 08 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
最省空间的计数器
2006/10/09 PHP
用phpmyadmin更改mysql5.0登录密码
2008/03/25 PHP
PHP 数字左侧自动补0
2008/03/31 PHP
PHP访问Google Search API的方法
2015/03/05 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
给WordPress的编辑后台添加提示框的代码实例分享
2015/12/25 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
使用TextRange获取输入框中光标的位
2006/10/14 Javascript
基于Jquery的实现回车键Enter切换焦点
2010/09/14 Javascript
jQuery写的日历(包括日历的样式及功能)
2013/04/23 Javascript
require.js深入了解 require.js特性介绍
2014/09/04 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
Css3制作变形与动画效果
2015/07/24 Javascript
jquery带动画效果幻灯片特效代码
2015/08/27 Javascript
基于jQuery插件实现点击小图显示大图效果
2016/05/11 Javascript
jquery UI Datepicker时间控件冲突问题解决
2016/12/16 Javascript
微信小程序 chooseImage选择图片或者拍照
2017/04/07 Javascript
通过js给网页加上水印背景实例
2019/06/17 Javascript
vue prop属性传值与传引用示例
2019/11/13 Javascript
JavaScript简易计算器制作
2020/01/17 Javascript
[28:28]Ti4 冒泡赛第二天NEWBEE vs NaVi 2
2014/07/15 DOTA
Django返回json数据用法示例
2016/09/18 Python
Python制作刷网页流量工具
2017/04/23 Python
Python3中详解fabfile的编写
2018/06/24 Python
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
浅谈Python中os模块及shutil模块的常规操作
2020/04/03 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
Django如何继承AbstractUser扩展字段
2020/11/27 Python
CSS3中31种选择器使用方法教程
2013/12/05 HTML / CSS
CSS3制作皮卡丘动画壁纸的示例
2020/11/02 HTML / CSS
英国购买威士忌网站:Master of Malt
2019/09/26 全球购物
护士在校生自荐信
2014/02/01 职场文书
国际贸易求职信
2014/07/05 职场文书
2015年试用期工作总结
2014/12/12 职场文书
2016年端午节校园广播稿
2015/12/18 职场文书
【海涛DOTA】D-cup邀请赛NV.cn vs DT.Love
2022/04/01 DOTA