python爬虫的一些总结
爬虫作用
- 收集数据
- 尽职调查(即:对公司行为的数据调查)
- 刷流量和秒杀
正则表达式
正则的基本符号
.
点号: 代替除换行符以外的任何一个字符*
星号: 前面的子表达式出现 0次 到 无限次?
问号: 前面的子表达式出现 0次 或 1次\
反斜杠: 转义字符开头()
小括号: 提取括号里面的内容
python中使用正则表达式
使用正则需要先导入模块
1 | import re |
此处为部分函数
findall
返回所有满足要求的内容
1 | re.findall(pattern, string, flags=0) |
search
返回第一个满足要求的字符串,找到就停止匹配
1 | re.search(pattern, string, flags=0) |
简单的网页爬取
requests
获取网页源代码
GET 请求
1 | import requests |
POST 请求
1 | import requests |
多线程爬虫
目的:提高爬取速度
python 多线程
Python语言在设计时候,有一个全局解释器锁(Global Interpreter Lock, GIL), 导致Python的多线程是伪多线程, 即 本质上还是
一个线程,但是这个线程每件事只做几毫秒,几毫秒之后就保存现场,换做其他事情,几毫秒之后再做其他的,如此反复。
微观为单线程,在宏观上是多线程。这种机制在 I/O密集型 影响不大,但是在 CPU计算密集型 ,由于只有CPU的一个核,就会对性能产生很大影响
多进程库
multiprocessing
是Python的多进程库,用来处理与多进程相关的操作。但由于进程与进程之间不能直接共享内存和堆栈资源,而且启动新的进程开销也比线程大得多,因此使用多线程来爬取比使用多进程有更多优势。multiprocessing
下面有一个dummy
模块,可以让Python的线程使用multiprocessing
的各种方法。
dummy
下面有一个Pool
类,它用来实现线程池。这个线程池有一个map()
方法,可以让线程池里面的所有程序都“同时”执行一个函数。
1 | from multiprocessing.dummy import Pool |
由于这个例子不涉及I/O操作,所以3个线程代码的运行时间并不小于单线程时间
原因: 线程切换需要时间
导致: 线程池不是越大越好
线程爬虫举例
此处需要了解到,多线程 和 事件驱动的异步模型 是有区别的。动作越多线程的效率越低。
1 | def query(url): |
高性能HTML内容解析
XPath
XPath(XML Path)是一种查询语句,特能够在XML和HTML的树状结构中寻找节点。
Python使用XPath需要安装第三方库:lxml
附录
- python函数注意事项
函数外面的容器类作为参数传递到函数后,如果函数修改了这个容器里面的值,那么函数外面的容器也会受到印象
(即:容器改变,普通变量不变)
- 如何读懂一个类
- 这个类有哪些属性(看外貌)
- 这个类有哪些方法(能做啥)
- 这些方法在哪调用(做啥的)
- 这些方法实现的细节(怎么做)
.*
和.*?
的区别
.*
贪婪模式,获取最长的满足条件的字符串.*?
非贪婪模式,获取最短的能满足条件的字符串