Python爬虫相关

一. 写在前面的话

首先, 爬虫这个东西, 确实处于灰色地带, 互联网上充斥着爬虫, 有合法的和不合法的, 基本上是没法靠法律追溯并且管制的, 很大程度上靠的是网站的反爬技术本身.

其次, 我觉得爬虫本身促进web技术的发展, 比如前后端分离的设计模式, 客户端渲染等等, 有一定程度上是为了保护服务器不被海量的不合法请求瘫痪和破坏, 以及保护数据安全.

最后, 虽然爬虫听起来似乎很厉害, 但本质上就是个体力活, 方便一点的可以requests库爬取 静态网页, 难受一点就用selenium爬取动态网页, 本质上优化的是人手动Ctrl+c/v这个过程, 其实不高端. 真正困难的是分析网页结构来自动化整个过程.

你真正需要的是:

  1. 强大的web能力, 大量html在你眼中自动变得清晰明了
  2. 长期的一线经历, 熟悉最新框架和反爬机制
  3. 小强般的精神, 没有什么问题不是分类解决不了的, 如果有, 那就再分一类. (指遇到不同的框架
  4. 钻研精神, 说到底你是在与开发人员斗智斗勇, 矛盾之争
  5. 一头茂盛的头发
  6. 胃药
  7. 咖啡和茶
  8. 舒服但是坐久了不舒服的椅子
  9. etc

二. 爬虫的基本操作

Selenium

感觉最近Selenium的爬虫写的有点多了, 我只能说这是没办法时候用的. 无他, 这玩意理论上需要加载整个网页, 太太太慢了你见过凌晨4点的绝望吗, 爬1w条数据要8个小时就会这样

安装Selenium

安装Selenium

在你的python环境里输入指令安装

1
pip install selenium

或者

1
conda install selenium
安装对应浏览器的webdriver

我用的是EDGE浏览器, 在官网下载的msedgedriver.exe

[官网链接](Microsoft Edge WebDriver - Microsoft Edge Developer)

注意下载对应浏览器版本的msedgedriver.exe!

查询Edge浏览器版本方法:

image-20230902000951702

下载Stable Channel稳定版

image-20230902001147364

版本号的第一个数字对上基本就没事, 然后根据电脑系统下载对应文件

最后解压文件得到msedgedriver.exe

可以考虑添加到系统PATH环境变量里去, 这样不用每次调用时候找文件位置.

使用Selenium

检查版本
1
2
import selenium #最简单的用法, 但是一般我们不会用到整个库
print(selenium.__version__) #输出版本号
打开网页
1
2
3
4
5
6
7
8
from selenium import webdriver 
driver = webdriver.Edge(executable_path = "D:/Extension_Packs/EdgeDriver116/msedgedriver.exe")
#支持的浏览器挺多, 经典的有Chrome, Edge, Firefox, Ie, Opera, Safari
#调用方式即为 webdriver.Chrome() / webdriver.Firefox() ...
#executalble_path 就是找我们的webdriver的路径, 这里我用的是Edge的msedgedriver.exe

url = "https://www.baidu.com" #百度网址, 记为url
driver.get(url) #用get命令打开网页

实际上并不需要多么精确的网址, 只要是能在浏览器地址栏输入的网址都可以写成url

比如

1
2
url = "baidu.com" #百度网址, 记为url
driver.get(url) #用get命令打开网页

这样也是可以打开的

查找网页元素

需要HTML和Web知识,

待填坑

1
2
3
4
5
6
7
8
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Edge(executable_path = "D:/Extension_Packs/EdgeDriver116/msedgedriver.exe")

url = "https://www.baidu.com"
driver.get(url)
response = driver.find_element(By.CLASS_NAME, "s_btn_wr").find_element(By.XPATH, "./input").get_attribute("value")
print(response)

你会得到一个百度一下的结果