文章目录
一、爬虫建议
爬虫和反爬虫的斗争
爬虫建议
- 尽量减少请求次数
- 保存获取到的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()