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守护进程用法实例分析
Jun 04 Python
正确理解python中的关键字“with”与上下文管理器
Apr 21 Python
python里使用正则表达式的组嵌套实例详解
Oct 24 Python
Django后台获取前端post上传的文件方法
May 28 Python
python实现录音小程序
Oct 26 Python
零基础使用Python读写处理Excel表格的方法
May 02 Python
python tkinter之顶层菜单、弹出菜单实例
Mar 04 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
Apr 15 Python
基于python实现模拟数据结构模型
Jun 12 Python
Python数据可视化实现多种图例代码详解
Jul 14 Python
Python 创建守护进程的示例
Sep 29 Python
尝试使用Python爬取城市租房信息
Apr 12 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正则表达匹配中文问题分析小结
2012/03/25 PHP
数组与类使用PHP的可变变量名需要的注意的问题
2013/06/20 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
2016/05/04 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
javascript 遍历验证所有文本框的值
2009/08/27 Javascript
实例说明为什么不要行内使用javascript
2014/04/18 Javascript
jQuery实现向下滑出的二级菜单效果实例
2015/08/22 Javascript
Javascript模仿淘宝信用评价实例(附源码)
2015/11/26 Javascript
基于jquery插件实现拖拽删除图片功能
2020/08/27 Javascript
AngularJS API之copy深拷贝详解及实例
2016/09/14 Javascript
完美解决JS文件页面加载时的阻塞问题
2016/12/18 Javascript
Vue form 表单提交+ajax异步请求+分页效果
2017/04/22 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
基于vue循环列表时点击跳转页面的方法
2018/08/31 Javascript
JS求1到任意数之间的所有质数的方法详解
2019/05/20 Javascript
基于原生js实现判断元素是否有指定class名
2020/07/11 Javascript
vue通过接口直接下载java生成好的Excel表格案例
2020/10/26 Javascript
基于ajax实现上传图片代码示例解析
2020/12/03 Javascript
用vite搭建vue3应用的实现方法
2021/02/22 Vue.js
[02:38]2018年度DOTA2最佳劣单位选手-完美盛典
2018/12/17 DOTA
Python3 实现串口两进程同时读写
2019/06/12 Python
Python Web框架之Django框架文件上传功能详解
2019/08/16 Python
树莓派安装OpenCV3完整过程的实现
2019/10/10 Python
Python 创建TCP服务器的方法
2020/07/28 Python
Django自定义YamlField实现过程解析
2020/11/11 Python
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
杭州SQL浙江浙大网新恩普软件有限公司
2013/07/27 面试题
会计应届生的自荐信
2013/12/13 职场文书
《花木兰》教学反思
2014/04/09 职场文书
全国税务系统先进集体事迹材料
2014/05/19 职场文书
物理学专业求职信
2014/07/04 职场文书
社区元宵节活动总结
2015/02/06 职场文书
社区母亲节活动总结
2015/02/10 职场文书
违规违纪检讨书范文
2015/05/06 职场文书