selenium+PhantomJS爬取豆瓣读书

 更新时间:2019年08月26日 17:18:57   作者:douyaoxin  
这篇文章主要为大家详细介绍了selenium+PhantomJS爬取豆瓣读书,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Win10下安装CUDA11.0+CUDNN8.0+tensorflow-gpu2.4.1+pytorch1.7.0+paddlepaddle-gpu2.0.0

    Win10下安装CUDA11.0+CUDNN8.0+tensorflow-gpu2.4.1+pytorch1.7.0+p

    这篇文章主要介绍了Win10下安装CUDA11.0+CUDNN8.0+tensorflow-gpu2.4.1+pytorch1.7.0+paddlepaddle-gpu2.0.0,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Django用数据库表反向生成models类知识点详解

    Django用数据库表反向生成models类知识点详解

    在本篇文章里小编给大家分享的是关于Django用数据库表反向生成models类知识点内容,需要的朋友们可以参考下。
    2020-03-03
  • Pytorch 卷积中的 Input Shape用法

    Pytorch 卷积中的 Input Shape用法

    这篇文章主要介绍了Pytorch 卷积中的 Input Shape用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python threading.local代码实例及原理解析

    Python threading.local代码实例及原理解析

    这篇文章主要介绍了Python threading.local代码实例及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • seek引发的python文件读写的问题及解决

    seek引发的python文件读写的问题及解决

    这篇文章主要介绍了seek引发的python文件读写的问题及解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • python实现字符串加密 生成唯一固定长度字符串

    python实现字符串加密 生成唯一固定长度字符串

    这篇文章主要为大家详细介绍了python实现字符串加密,生成唯一固定长度字符串,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • Python过滤掉numpy.array中非nan数据实例

    Python过滤掉numpy.array中非nan数据实例

    这篇文章主要介绍了Python过滤掉numpy.array中非nan数据实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python爬虫之Requests库基本使用详解

    Python爬虫之Requests库基本使用详解

    这篇文章主要介绍了Python爬虫之Requests库基本使用详解,Requests 库是在 urllib 模块的基础上开发而来,继承了urllib.request的所有特性,与urllib.request 相比,Requests 在使用时更加简洁方便、快捷,所以 Requests 库在编写爬虫程序时使用较多,需要的朋友可以参考下
    2023-09-09
  • Python进阶之自定义对象实现切片功能

    Python进阶之自定义对象实现切片功能

    这篇文章主要介绍了Python进阶之自定义对象实现切片功能,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Python Pillow Image.save 保存为jpg图片压缩问题

    Python Pillow Image.save 保存为jpg图片压缩问题

    Pillow 库支持多种图片格式,Pillow 能够很轻松地实现图片格式之间的转换。本文就来详细的介绍一下Image.save的具体使用,感兴趣的可以了解一下
    2021-11-11

最新评论