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和IPython中使用Docker
Apr 28 Python
python爬虫实现教程转换成 PDF 电子书
Feb 19 Python
Python自动生产表情包
Mar 17 Python
Windows下Anaconda的安装和简单使用方法
Jan 04 Python
Python os.access()用法实例
Feb 18 Python
Django ORM 自定义 char 类型字段解析
Aug 09 Python
python 利用turtle库绘制笑脸和哭脸的例子
Nov 23 Python
Python实现结构体代码实例
Feb 10 Python
Python基于tkinter canvas实现图片裁剪功能
Nov 05 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
Dec 07 Python
如何利用opencv判断两张图片是否相同详解
Jul 07 Python
68行Python代码实现带难度升级的贪吃蛇
Jan 18 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中for循环语句的几种变型
2007/03/16 PHP
php使用PDO方法详解
2014/12/27 PHP
PHP微信开发之文本自动回复
2016/06/23 PHP
php 判断页面或图片是否经过gzip压缩的方法
2017/04/05 PHP
最佳JS代码编写的14条技巧
2011/01/09 Javascript
js跑马灯代码(自写)
2013/04/17 Javascript
JavaScript调用客户端的可执行文件(示例代码)
2013/11/28 Javascript
分享纯手写漂亮的表单验证
2015/11/19 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
2016/11/09 Javascript
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
2017/09/26 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
JS实现模糊查询带下拉匹配效果
2018/06/21 Javascript
Vue.js上传图片到阿里云OSS存储的方法示例
2018/12/13 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
2019/06/11 Javascript
微信小程序静默登录的实现代码
2020/01/08 Javascript
微信小程序实现比较功能的方法汇总(五种方法)
2020/03/07 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
Vue 电商后台管理项目阶段性总结(推荐)
2020/08/22 Javascript
[35:43]2018DOTA2亚洲邀请赛 4.1 小组赛B组 paiN vs Effect
2018/04/03 DOTA
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
Python中的默认参数实例分析
2018/01/29 Python
Python 实现异步调用函数的示例讲解
2018/10/14 Python
python消费kafka数据批量插入到es的方法
2018/12/27 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
2019/07/11 Python
python 协程中的迭代器,生成器原理及应用实例详解
2019/10/28 Python
Reebonz中国官网:新加坡奢侈品购物网站
2017/03/17 全球购物
十岁生日家长答谢词
2014/01/17 职场文书
技校毕业生自荐信范文
2014/03/07 职场文书
学校社会实践活动总结
2014/07/03 职场文书
建筑安全生产目标责任书
2014/07/23 职场文书
个人授权委托书范本
2014/09/14 职场文书
2016年9月份红领巾广播稿
2015/12/21 职场文书
2016大学军训心得体会
2016/01/11 职场文书
奖学金申请书(范文)
2019/08/14 职场文书
解决Golang中goroutine执行速度的问题
2021/05/02 Golang
Elasticsearch 批量操作
2022/04/19 Python