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使用 HTMLTestRunner.py生成测试报告
Oct 20 Python
python http接口自动化脚本详解
Jan 02 Python
python使用xpath中遇到:到底是什么?
Jan 04 Python
快速了解Python开发中的cookie及简单代码示例
Jan 17 Python
使用apidocJs快速生成在线文档的实例讲解
Feb 07 Python
浅析python打包工具distutils、setuptools
Apr 20 Python
Python引用计数操作示例
Aug 23 Python
python实现在图片上画特定大小角度矩形框
Oct 24 Python
pandas分别写入excel的不同sheet方法
Dec 11 Python
python实现Dijkstra算法的最短路径问题
Jun 21 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
Jan 10 Python
python中super()函数的理解与基本使用
Aug 30 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
cmd下运行php脚本
2008/11/25 PHP
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
2013/06/24 PHP
PHP实现限制IP访问及提交次数的方法详解
2017/07/17 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
使用PHP反射机制来构造"CREATE TABLE"的sql语句
2019/03/21 PHP
PHP中的自动加载操作实现方法详解
2019/08/06 PHP
Laravel 实现添加多语言提示信息
2019/10/25 PHP
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
js 判断脚本加载完毕的代码
2011/07/13 Javascript
JavaScript 验证码的实例代码(附效果图)
2013/03/22 Javascript
百度地图自定义控件分享
2015/03/04 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
2015/09/02 Javascript
AngularJs Injecting Services Into Controllers详解
2016/09/02 Javascript
Kendo Grid editing 自定义验证报错提示的解决方法
2016/11/18 Javascript
详解PHP中pathinfo()函数导致的安全问题
2017/01/05 Javascript
全面解析Node.js 8 重要功能和修复
2017/06/02 Javascript
JS检测是否可以访问公网服务器功能代码
2017/06/19 Javascript
深入理解JS中Number(),parseInt(),parseFloat()三者比较
2018/08/24 Javascript
Vue基础配置讲解
2019/11/29 Javascript
Vue项目打包部署到apache服务器的方法步骤
2021/02/01 Vue.js
用Python脚本生成Android SALT扰码的方法
2013/09/18 Python
Python中Threading用法详解
2017/12/27 Python
详细介绍Python进度条tqdm的使用
2019/07/31 Python
Python Pandas对缺失值的处理方法
2019/09/27 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
解决TensorFlow程序无限制占用GPU的方法
2020/06/30 Python
python绘制分布折线图的示例
2020/09/24 Python
浅谈CSS3中display属性的Flex布局的方法
2017/08/14 HTML / CSS
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
html5将图片转换成base64的实例代码
2016/09/21 HTML / CSS
VELTRA台湾:世界自由行专家
2017/08/15 全球购物
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
丝绸和人造花卉、植物和树木:Nearly Natural
2018/11/28 全球购物
小学秋季运动会报道稿
2014/09/30 职场文书
个人工作决心书
2015/09/22 职场文书
java项目构建Gradle的使用教程
2022/03/24 Java/Android