之前没有系统对爬虫相关的东西学习过, 边看视频边做个笔记.
request / response
request是浏览器/程序向服务器发出的一些信息, 用于请求需要展示的内容, resoponse则是服务器对接收到的请求给出的回应信息.
request的内容信息
- 请求方式: GET / POST(最常用)
- POST相对GET多了form data
- GET的参数直接包含在URL中, 而POST请求则包含在表单中
- 请求URL: URL是统一资源定位符, 就是文件/对象的链接
- 请求头: 重要的配置信息, 以键值对方式存储
- 请求体: GET时一般无信息, POST需要
- 请求方式: GET / POST(最常用)
response的内容信息
- 响应状态码: 用来表示请求情况的数字代码
- 响应头
- 相应体: 请求的结果
python request模块使用
requests基于urllb3, 使用更方便功能更丰富
GET请求相关
请求参数添加
- params参数可以方便的给请求增加参数, 省去手动编写URL
1 | data = { |
json解析
- 提供了
json
方法, 可直接把返回的json字符串变成json对象
1 | response = request.get('url', params=data) |
二进制数据获取
- 使用get请求直接请求图片即可, 然后写入的时候以’wb’形式写入文件即可
添加header
- 主要是为了保证获取成功, 有些网站会识别User-Agent以防止机器爬取
1 | headers = { |
POST请求相关
请求参数 / 头添加
- 同GET部分(见上)
response属性
- 常用属性包括:
- status_code
- headers
- cookies
- url
- history
状态码分析
- requests库本身内置了状态码的分类情况, 所以直接调用内置的信息就可以快速判断请求是否正常/成功, 比如
response.status_code.ok
就相当于200
1 | response = requests.get('url') |
代理设置
1 | proxy = { |
如果要使用ss, 则需要另外安装插件
1 | pip install 'requests[socks]' |
1 | proxy = { |
超时设置
可以结合try
进行异常处理
1 | response = requests.get('url', timeout = 1) |
Selenium部分
对于通过js获取数据并进行渲染展示的内容, 在分析页面请求的时候可能会有些东西找不到. 此时可以通过Selenium控制浏览器来进行操作. 虽然这样的效率不高, 但是对于我这种对Web相关的东西不熟的人来说非常适用.
元素查找
模拟网页操作首先要找到需要操作元素的位置, Selenium提供了多种元素定位的方式, 当使用的是find_elememt
会返回第一个找到的符合要求的元素, 而使用find_elememts
则会以列表返回所有对象
1 | browser = webdriver.Firefox() |
iframe定位
一个网页可能是分了好几块的, 大的框架中可能内嵌了一个或多个iframe
, 当位于大框架中时, 是无法搜索/定位小框架内的内容的, 也就无法进行相应操作, 因此需要在操作前进行框切换
1 | browser = webdriver.Firefox() |
弹窗操作
有时候部分操作会弹出一个警示框, 需要切换到这个框进行相应操作, 然后才能继续后续步骤
1 | # 切换到弹窗 |
浏览器设置变更
有时需要对浏览器进行特殊设置后才能完成所需操作, 比如我某次爬取的数据可以通过点击一个下载按钮获得, 但是正常情况下点击下载按钮浏览器会弹出下载窗口并
1 | options = Options() |
等待设定
Selenium的所有操作会在页面加载完成之后才进行, 但是由于网络的问题, 如果等到加载完毕再执行非常影响效率(Selenium与纯靠代码发送请求的方式相比本来就比较没效率了), 所以可以通过一些设定在满足特定条件后立即执行相关操作. 比如下面就是等待一个特定的搜索按钮可以点击后, 再输入搜索内容并点击搜索.
1 | button = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'search-bar-btn'))) |
下载文件检查
Selenium本身并不能完成下载文件的管理, 因此只能通过别的方式来进行下载文件管理/重命名.
- 对于可以通过网页代码解析出下载链接的, 可以通过调用别的工具进行下载
- 对于解析不出下载链接的, 可以通过
os
模块的相关内容监视下载文件, 并在下载后进行移动及重命名 - 我当时使用的是下面俩部分代码加起来的:
1 | import os |
关于模拟点击的坑
Selenium可以模拟对按钮, 链接, 复选框等的点击, 但是点击的前提是, 这些元素必须处于可见范围, 否则点击会无效或者会抛出异常. 因此, 在实际操作时, 需要自己测试一下是否要滚动页面, 以及滚动多少能保证元素可以被点击得到.
1 | # 切出iframe |
杂项
- 一般第一个get请求得到的是网页的框架, 然后解析框架时再发出新的请求把需要的内容填充到页面
- 如果需要获得相应信息需要分析ajax请求
- Selenium/WebDriver
- Splash