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使用any判断一个对象是否为空的方法
Nov 19 Python
Python用Bottle轻量级框架进行Web开发
Jun 08 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
Mar 12 Python
python3实现跳一跳点击跳跃
Jan 08 Python
python爬虫之xpath的基本使用详解
Apr 18 Python
Python中xml和json格式相互转换操作示例
Dec 05 Python
详解用Python练习画个美队盾牌
Mar 23 Python
Python数据类型之Dict字典实例详解
May 07 Python
python中的&&及||的实现示例
Aug 07 Python
python快速排序的实现及运行时间比较
Nov 22 Python
python 实现简易的记事本
Nov 30 Python
使用Python获取字典键对应值的方法
Apr 26 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获取url的函数代码
2011/08/02 PHP
PHP获取当前所在目录位置的方法
2014/11/26 PHP
php利用smtp类实现电子邮件发送
2015/10/30 PHP
Zend Framework上传文件重命名的实现方法
2016/11/25 PHP
thinkphp jquery实现图片上传和预览效果
2020/07/22 PHP
Thinkphp整合微信支付功能
2016/12/14 PHP
PHP PDOStatement::setFetchMode讲解
2019/02/03 PHP
javascript 三种编解码方式
2010/02/01 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
js实现二代身份证号码验证详解
2014/11/20 Javascript
js实现键盘Enter键提交表单的方法
2015/05/27 Javascript
jquery validate demo 基础
2015/10/29 Javascript
Node.js 条形码识别程序构建思路详解
2016/02/14 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
jQuery图片轮播插件——前端开发必看
2016/05/31 Javascript
jQuery遮罩层实例讲解
2017/05/11 jQuery
使用Angular CLI从蓝本生成代码详解
2018/03/24 Javascript
详解如何构建一个Angular6的第三方npm包
2018/09/07 Javascript
vue+elementUI 复杂表单的验证、数据提交方案问题
2019/06/24 Javascript
[10:18]2018DOTA2国际邀请赛寻真——找回自信的TNCPredator
2018/08/13 DOTA
Python使用redis pool的一种单例实现方式
2016/04/16 Python
python正则表达式re之compile函数解析
2017/10/25 Python
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
python实现爬取百度图片的方法示例
2019/07/06 Python
如何关掉pycharm中的python console(图解)
2019/10/31 Python
python的faker库用法
2019/11/28 Python
Python实现自动签到脚本的示例代码
2020/08/19 Python
如何利用Python 进行边缘检测
2020/10/14 Python
全球最大的服务市场:Fiverr
2017/01/03 全球购物
幼儿园大班评语大全
2014/04/17 职场文书
企业公益活动策划方案
2014/08/24 职场文书
如何利用JavaScript实现二叉搜索树
2021/04/02 Javascript
JS + HTML 罗盘式时钟的实现
2021/05/21 Javascript
python中subplot大小的设置步骤
2021/06/28 Python
Mysql如何实现不存在则插入,存在则更新
2022/03/25 MySQL
CSS 鼠标点击拖拽效果的实现代码
2022/12/24 HTML / CSS