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的正则表达式re模块的常用方法
Mar 09 Python
python中二维阵列的变换实例
Oct 09 Python
开始着手第一个Django项目
Jul 15 Python
python dict.get()和dict['key']的区别详解
Jun 30 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 Python
pandas 根据列的值选取所有行的示例
Nov 07 Python
IntelliJ IDEA安装运行python插件方法
Dec 10 Python
python执行精确的小数计算方法
Jan 21 Python
Django文件存储 自己定制存储系统解析
Aug 02 Python
python类中super() 的使用解析
Dec 19 Python
Python3.7实现验证码登录方式代码实例
Feb 14 Python
python全面解析接口返回数据
Feb 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
150kHz到30Mhz完全冲浪手册
2020/03/20 无线电
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
Yii实现简单分页的方法
2016/04/29 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
2020/04/06 PHP
使用prototype.js进行异步操作
2007/02/07 Javascript
读jQuery之六 缓存数据功能介绍
2011/06/21 Javascript
一个简单的js树形菜单
2011/12/09 Javascript
jQuery实现倒计时按钮功能代码分享
2014/09/03 Javascript
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
2014/10/17 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
JavaScript和JQuery获取DIV值的方法示例
2017/03/07 Javascript
jquery事件与绑定事件
2017/03/16 Javascript
解决html input验证只能输入数字,不能输入其他的问题
2017/07/21 Javascript
canvas+gif.js打造自己的数字雨头像的示例代码
2017/10/26 Javascript
Django中实现点击图片链接强制直接下载的方法
2015/05/14 Python
对python pandas 画移动平均线的方法详解
2018/11/28 Python
python/Matplotlib绘制复变函数图像教程
2019/11/21 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
2019/12/04 Python
python 画3维轨迹图并进行比较的实例
2019/12/06 Python
python求一个字符串的所有排列的实现方法
2020/02/04 Python
基于Python爬取京东双十一商品价格曲线
2020/10/23 Python
python实现b站直播自动发送弹幕功能
2021/02/20 Python
德国婴儿服装和婴儿用品购买网站:Baby Sweets
2019/12/08 全球购物
民族团结先进集体事迹材料
2014/05/22 职场文书
植树造林的宣传标语
2014/06/23 职场文书
公司的门卫岗位职责
2014/09/09 职场文书
2014年后勤工作总结
2014/11/18 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
北京天坛导游词
2015/02/12 职场文书
2015年“七七卢沟桥事变”纪念活动总结
2015/03/24 职场文书
劳动争议仲裁代理词
2015/05/25 职场文书
初二物理教学反思
2016/02/19 职场文书
《折线统计图》教学反思
2016/02/22 职场文书
三十年再续同学情倡议书
2019/11/27 职场文书
MyBatis-Plus 批量插入数据的操作方法
2021/09/25 Java/Android