2021/5/12爬虫第十一次课(ajax、selenium、Phantomjs)

一、爬虫建议

爬虫和反爬虫的斗争
在这里插入图片描述
爬虫建议

  • 尽量减少请求次数
    • 保存获取到的HTML,供查错和重复使用
  • 关注网站的所有类型的页面
    • H5页面
    • APP
  • 多伪装(随机U-A、cookie、代理IP)
  • 利用多线程分布式
    • 在不被发现的情况下我们尽可能的提高速度

随机U-A实现

from fake_useragent import UserAgent
ua = UserAgent()
print(ua.firefox)

二、ajax技术的处理(selenium背景介绍)

前导:

我们以前爬取的网页大多数都是一些静态的网页

何为静态网页?其实就是 我们像一个 网站(url)发起请求 得到响应 那么这些响应的数据都是在网页的源代码当中 ,这时就直接解析

除了静态网页 还有一些网页或者是网站的数据不在这个请求的url 地址当中。那么这些数据有可能是通过ajax技术加载出来的数据

2.1ajax基本介绍

了解动态HTML技术

  • JS
    • 是网络上最常用的脚本语言,它可以收集用户的跟踪数据,不需要重载页面直接提交表单,在页面嵌入多媒体文件,甚至运行网页
  • jQuery
    • jQuery是一个快速、简介的JavaScript框架,封装了JavaScript常用的功能代码
  • ajax
    • ajax可以使用网页实现异步更新,可以在不重新加载整个网页的情况下,对网页的某部分进行更新

2.2获取ajax加载的数据的方式

1.直接分析ajax调用的接口(真正的目标URL)。然后通过代码请求这个接口。
2.使用Selenium+chromedriver模拟浏览器行为获取数据
两者的区别
那么这两种方式用哪一个? 1 具体情况具体分析 2 根据你自己的技术的掌握长度
案例(直接分析ajax调用的接口)

百度贴吧
需求:爬取 海贼王吧 爬取桌面壁纸
​
1 分析页面
我们发现要爬取的数据是图片,那么就只要找到它(每张图片)的src 就可以了

经过分析发现网页源码当中没有我们想要爬取的数据。然后我们确定它是经过ajax加载的数据
一般情况下 ajax请求都在 XHR这个选项(XMLHttpRequest)
通过network 继续找真实的数据接口
​
目标url
https://tieba.baidu.com/photo/g/bw/picture/list?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&alt=jview&rn=200&tid=1934517161&pn=1&ps=1&pe=40&info=1&_=1620822548466
​
解析数据
可以把(response)数据通过json (利用json.cn)转换成Python的数据类型的字典(preview)。 然后通过key-value形式找到 每张图片的url
也可以通过正则(对(response)数据直接进行解析) 
murl: "https://imgsa.baidu.com/forum/wh%3D321%2C200/sign=14a3fa55828ba61edfbbc02c7305bb38/4c53ca8065380cd734b55e72a144ad34588281b0.jpg"
("murl":"(.*?)")2 实现逻辑(具体的一些细节)
​
通过结果发现呢? 图片的数量少了 有可能是服务器发了多次请求。所以这个时候我们就想到了 会不会还有一些数据接口呢?
我们继续往下拖动图片的过程当中 发现又出现了2个数据接口
​
https://tieba.baidu.com/photo/g/bw/picture/list?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&alt=jview&rn=200&tid=1934517161&pn=1&ps=40&pe=79&wall_type=h&_=1620823519114
​
https://tieba.baidu.com/photo/g/bw/picture/list?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&alt=jview&rn=200&tid=1934517161&pn=1&ps=79&pe=118&wall_type=h&_=1620823534332
​
得出规律
ps=1 ps=40 ps=79   pe=40 pe=79 pe=118   规律 39
for i in range(1,80,39):
    print(i)
​
总结:
1 先确定要爬取的数据是否在网页的源码当中
如果在正常的取请求,如果不在要通过Network 分析真实的数据接口(数据包、name、URL)
​
2 在确定好数据接口之后 像目标的url发起请求 获取响应
​
3 正常的用 比较合适的技术去解析数据
如果数据数量不对。然后继续往下拖动拖动条 找到相似的数据包 进行分析解决
补充: 具体情况具体分析

附代码
技巧:
response(html源代码)可能看的不舒服时,可以参考 检查或可以把(response)数据通过json (利用json.cn)转换成Python的数据类型的字典

import requests
import re
import time
'''

https://tieba.baidu.com/photo/g/bw/picture/list?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&alt=jview&rn=200&tid=1934517161&pn=1&ps=1&pe=40&info=1&_=1620822548466

https://tieba.baidu.com/photo/g/bw/picture/list?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&alt=jview&rn=200&tid=1934517161&pn=1&ps=40&pe=79&wall_type=h&_=1620823519114

https://tieba.baidu.com/photo/g/bw/picture/list?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&alt=jview&rn=200&tid=1934517161&pn=1&ps=79&pe=118&wall_type=h&_=1620823534332

ps=1 ps=40 ps=79   pe=40 pe=79 pe=118   规律 39

'''
name = 1
for i in range(1,80,39):


    # 目标url
    # url = 'https://tieba.baidu.com/photo/g/bw/picture/list?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&alt=jview&rn=200&tid=1934517161&pn=1&ps=1&pe=40&info=1&_=1620822548466'
    url = 'https://tieba.baidu.com/photo/g/bw/picture/list?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&alt=jview&rn=200&tid=1934517161&pn=1&' + '&ps=' + str(i) + '&pe=' + str(39 + i) + '&wall_type=h&_=1620823534332'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36'
    }

    res = requests.get(url,headers=headers)
    # print(res.text)
    # 正则表达式匹配数据
    img_urls = re.findall('"murl":"(.*?)"',res.text)

    for img_url in img_urls:
        img_response = requests.get(img_url)
        # 保存数据
        print('正在下载第%d张图片' % name)
        with open('img/%d.jpg'%name,'wb') as file_obj:
            # time.sleep(0.5)
            file_obj.write(img_response.content)

        name += 1
    time.sleep(1)

三、Phantomjs快速入门

一无头浏览器:一个完整的浏览器内核,包括js解析引擎,渲染引擎,请求处理等,但是不包括显示和用户交互页面的浏览器
用处:
1 有的程序是用的是它
2 对比的去学习chromedriver

练习


from selenium import webdriver
import time
# 没有配置之前需要添加驱动的路径
driver = webdriver.PhantomJS("安装目录")
'''
没有配置驱动会报的错误
Message: 'phantomjs' executable needs to be in PATH. 

解决 找到驱动的绝对路径
     或者添加到path环境变量当中 一劳永逸(可以添加到你python解释器的文件夹当中)
'''

driver.get('https://www.baidu.com/') # 加载一个网站

# 先定位输入框, 再输入,
driver.find_element_by_id('kw').send_keys('python')

# input_tag = driver.find_element_by_id('kw')
# input_tag.send_keys('python')
#先定位, 再操作
driver.find_element_by_id('su').click()
time.sleep(2)

print(driver.current_url) # 查看当前请求的url

driver.save_screenshot('baidu.png')

四、Selenium+chromedriver

4.1Selenium+chromedriver 介绍

• selenium是一个web的自动化测试工具,最初是为网站自动化测试而开发的,selenium可以直接运行在浏览器上,它支持所有主流的浏览器,可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏
• chromedriver是一个驱动Chrome浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:
• Chrome:http://chromedriver.storage.googleapis.com/index.html
• Firefox:https://github.com/mozilla/geckodriver/releases
• Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
• Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/

• chromedriver安装总结:https://www.jianshu.com/p/a383e8970135
• 安装Selenium:pip install selenium

4.2selenium快速入门

from selenium import webdriver
import time
driver = webdriver.Chrome()

# 加载百度 咋学习呀?通过简单的源码分析 发现了这个方法的区别

driver.get('https://www.baidu.com/')

time.sleep(2)
driver.maximize_window()
time.sleep(1)
# 关闭窗口(当前窗口)
driver.close()

time.sleep(2)
# 退出驱动(关闭所有的窗口)
driver.quit()
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
需要的添加的jar包及工具:我这里使用maven来构建项目,添加依赖如下:   org.seleniumhq.selenium   selenium-java   3.2.0    PhantomJs工具到官网去下载:http://phantomjs.org/download.html 尽量都使用最新版本,不然会出现版本兼容的情况。 这里有一个已经写好的获取PhantomJSDriver的工具类 public static WebDriver getPhantomJs() {   String osname = System.getProperties().getProperty("os.name");   if (osname.equals("Linux")) {//判断系统的环境win or Linux     System.setProperty("phantomjs.binary.path", "/usr/bin/phantomjs");   } else {     System.setProperty("phantomjs.binary.path", "./phantomjs/win/phantomjs.exe");//设置PhantomJs访问路径   }   DesiredCapabilities desiredCapabilities = DesiredCapabilities.phantomjs();   //设置参数   desiredCapabilities.setCapability("phantomjs.page.settings.userAgent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0");   desiredCapabilities.setCapability("phantomjs.page.customHeaders.User-Agent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:50.0) Gecko/20100101   Firefox/50.0");   if (Constant.isProxy) {//是否使用代理     org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy();     proxy.setProxyType(org.openqa.selenium.Proxy.ProxyType.MANUAL);     proxy.setAutodetect(false);     String proxyStr = "";     do {       proxyStr = ProxyUtil.getProxy();//自定义函数,返回代理ip及端口     } while (proxyStr.length() == 0);     proxy.setHttpProxy(proxyStr);     desiredCapabilities.setCapability(CapabilityType.PROXY, proxy);   }   return new PhantomJSDriver(desiredCapabilities); } 获取方式     try{     WebDriver webDriver = PhantomJsUtil.getPhantomJs();     webDriver.get(url);     SleepUtil.sleep(Constant.SEC_5);     PhantomJsUtil.screenshot(webDriver);     WebDriverWait wait = new WebDriverWait(webDriver, 10);     wait.until(ExpectedConditions.presenceOfElementLocated(By.id(inputId)));//开始打开网页,等待输入元素出现     Document document = Jsoup.parse(webDriver.getPageSource());     //TODO  剩下页面的获取就按照Jsoup获取方式来做   }finally{     if (webDriver != null) {       webDriver.quit();     }   } python版使用webdriver+PhantomJs爬虫使用,参考http://www.cnblogs.com/kuqs/p/6395284.html

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笔记本IT

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值