爬虫(五):动态html --- 反爬策略,selenium + phantomjs,案例:爬取豆瓣图书(页面内容是 js 代码,获取加密数据)

1、path 环境变量的作用:

  为了让 cmd 找到各种命令 exe 工具,配 path 环境变量就找 exe 所在目录配置就可以了。

C:\Anaconda3\Scripts---找pip.exe
C:\Anaconda3----python.exe

多个版本,如何共存?

  python3.7

  anaconda

  放在前面的先被使用

2、修改完 path,要重启 cmd

where python
path
------------
pip install redis
pip install aiohttp
pip install asyncio

一、反爬策略

  1. 封装请求头
    • user-agent
    • referer
    • cookie
  2. 限制访问频率
    • 代理池
    • 在用户访问高峰期进行爬取,冲散日志。
    • 设置等待时长。time.sleep()
  3. ajax 异步请求,用接口获取数据
  4. 能一次性获取的数据,绝不发送第二次请求(获取数据的过程中尽量减少请求次数。)
    • 能在列表页获取的数据,绝不进详情页
  5. 页面内容是 js 代码
    • selenium + phantomjs 的组合进行页面内容的获取。

二、html页面技术

1、js

  页面在请求 html 的过程中,服务器返回 html,同时还会请求 js 文件。

2、jquery

  jQuery 是 js 库,为了方便 js 开发。一个网站使用 jQuery 的特征,就是源代码里包含了 jQuery入口,比如:

<script type="text/javascript" src="http://statics.huxiu.com/w/mini/static_2015/js/sea.js?v=201601150944"></script>

  如果你在一个网站上看到 jQuery,那么采集这个网站的数据的时候要格外小心。jQuery 可以动态地创建 HTML 内容,只有在 JavaScript 代码执行之后才会显示。如果你用传统的方法采集页面内容,就只能获得 JavaScript 代码执行之前页面上的内容。

3、ajax

  ajax :web的异步请求技术

  同步请求,异步请求。

在这里插入图片描述

三、selenium 和 phantomjs

1、什么是 selenium?

  selenium 是一个 web 自动化测试工具。但是它本身是不带浏览器的。这个工具其实就是作为一些外部工具驱动来使用的,可以控制一些外部应用来完成自动化测试。

2、什么是 phantomjs?

  phantomjs:他其实就是一个内置无界面浏览器引擎。 — 无界面可以提高程序运行速度。

  因为 phantomjs 是一个浏览器引擎,所以他最大的功能就是执行页面的 js 代码

3、安装 selenium 和 phantomjs

selenium 安装:pip install selenium==2.48.0

phantomjs 安装:

  百度搜索’phantomjs镜像’ -->下载一个Windows版本的 -->phantomjs-2.1.1-windows.zip

可视化的 chrome 浏览器插件,chromedriver 安装:

  百度搜索 “chromedriver镜像” --> 保证 chrome 是正版 -->查看自己 chrome 的版本号 -->找一个和自己版本号最接近的版本下载。

将下载好的 exe 文件复制到:C:\Anaconda3\Scripts

4、案例:百度(selenium)

# 导包
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

# 1、创建一个浏览器驱动
driver = webdriver.Chrome()
# 2、用浏览器请求url
driver.get('https://www.baidu.com/')
# 在百度的输入框里面输入python爬虫,搜索
input = driver.find_element_by_id('kw')
print(input) # WebElement对象
# WebElement其实就是页面中一些web组件。div,span,input
# WebElement可以做什么呢?
# click()
# send_keys()
# 截屏
# driver.save_screenshot('before.png')
input.send_keys(u'python爬虫')
# driver.save_screenshot('after.png')

# 点击百度一下
driver.find_element_by_id('su').click()
"""
哪些方法可以得到WebElement对象?
    find_element_by_id --通过id来查找
    find_element_by_css_selector --通过css选择器查找
    find_element_by_xpath --通过xpath表达式查找
"""
# 获取元素的坐标
# print(input.location)
# 元素的大小
# print(input.size)
# 获取属性值
# print(input.get_attribute('value'))

# 快捷键的使用
input.send_keys(Keys.CONTROL,'a')
input.send_keys(Keys.CONTROL,'x')
input.send_keys(u'人工智能')
driver.find_element_by_id('su').click()

# driver.quit()  # 退出浏览器
driver.close() # 关闭当前页

5、案例:爬取豆瓣图书(页面内容是js代码)

请求url:https://search.douban.com/book/subject_search?search_text=python&cat=1001&start=0

要求:

  1. 实现分页
  2. 字段
    • 书名
    • 评分
    • 作者
    • 出版社
    • 出版日期
    • 价格
    • 详情页url
  3. 将数据写入excel中

思考:返回的response.text中没有书籍信息,为什么会出现这样的情况?该怎么解决?

  返回的页面内容是 js 代码,用 selenium + phantomjs 解析页面内容

import time,os

import requests
from lxml import etree
from selenium import webdriver
import xlwt
import xlrd
from xlutils.copy import copy

# 实现excel的追加写入
def write_to_excel_append(books,filename):
    # 要写入数据的行数
    index = len(books)
    # 打开工作簿
    work_book = xlrd.open_workbook(filename)
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值