1.python 安装及配置
下载地址
python2 和 python3 共存安装
2.python 可视化
import turtleturtle.pensize(2) #画一个小圆 turtle.circle(10) turtle.circle(40) turtle.circle(80) turtle.circle(160)
工具:
python IDE:pycharm
https://pan.baidu.com/s/1s_bkgDT0QxNTQY07LnQRWQ?pwd=2dlb
提取码:2dlb
Windows + sublime/VSCode + python
Linux + vim/sublime + ipython
pip 官网:https://pypi.org/project/pip/(python 2.7.9 + 或 python 3.4 + 以上版本自带)
3.python 网页爬虫
3.1.爬虫思想
爬虫:数据皆可取
Linux:一切皆文件
python:一切皆对象
LaTex:所想即所得
Office:所见即所得
爬虫会造成短时间内服务器吞吐量过大,CPU 升高,负载过重,影响正常用户的访问;出于对数据保护,网站所有者会设置验证码、滑动窗口等需要人为交互的操作来保证访问确保不是爬虫程序,因此爬虫需要考虑到规划、负载
通常网站所有者会在网站根路径下放置一个 robots.txt 文件,该文件定义了一套协议规定网络爬虫器不应该爬取或允许爬取那些区域
3.2.HTTP 请求协议
最基本的 HTTP 请求方法:GET、POST、PUT、DELETE
3.3.常用 python 库
1.urllib/urllib2/urllib3:https://docs.python.org/zh-cn/3/library/urllib.html(自带)
urllib 是一个收集了多个涉及 URL 的模块的包,包含打开、读取、解析URL、解析 robots.txt 文件、异常处理等功能
python3 中也有 urllib 和 urllib3 两个库,urllib 几乎是 python2.7 中 urllib 和urllib2 两个模块的集合,所以常用 urllib 模块,而 urllib3 则作为一个拓展模块使用。python2.7 中的 urllib2 相当于 python3 中的 urllib.request。
通常 python2.7 中的 urllib2 在移植到 python3 中时可疑改写成:import urllib.request as urllib2
2.requests:https://requests.readthedocs.io/zh_CN/latest(pip install requests)
该模块允许发送 HTTP/1.1 请求
3.beautiful soup:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/#(pip install beautifulsoup4)
该模块可以从 HTML 或 XML 文件中提取数据,能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。
3.4.案例1-爬取图片
#coding:utf-8 from requests import * from re import * """ coding:utf-8:指定编码格式 爬取多肉图片并保存在本地 """for i in range(5):#获取站点源码a=get('https://www.duitang.com/blog/?id=14188000%d'%(i+47))""".:匹配一个+:后面所有的都能匹配上?:最小化匹配(能匹配多少就匹配多少).+?:能匹配所有的东西找对应的图片源码,限制找源码中只能有多肉图片那一行代码:<img alt=".+?" id="mbpho-img" class="js-favorite-blogimg" src="https保证能够精准匹配src="(https.+?)":这里加括号表示只需要括号这部分内容若没有后面的style匹配,那么返回的结果就会从https开始后面的所有字符,包括stype中的内容"""reg=compile(r'<img alt=".+?" id="mbpho-img" class="js-favorite-blogimg" src="(https.+?)" style=".+?" />')#输出找到的图片地址,findall:查找所有跟上述代码一样的内容#print(findall(reg,a.text)) ,text:会对内容进行转码操作datas=findall(reg,a.text)#请求刚才匹配到的数据,content:获取源码img=get(datas[0]).content#将请求到的图片保存到本地 /img 下f=open('./img/%d.jpg'%(i),'wb')f.write(img)f.close()
3.5.requests 库的使用
import requests """ requests 库的使用 """r= requests.get('https://github.com/timeline.json',headers = dict, #头信息params = dict, #Url参数paramsdata = dict, #发送表单postproxies = dict, #代理cookies = dict, #添加cookie信息timeout = int #设置超时事件 ); r.txt #获取源码 r.status_code #获取状态码
3.6.正则表达式
\:转义
^:匹配首字符串
$:匹配尾字符串
*:匹配前面子表达式零次或多次
+:匹配前面子表达式一次或多次
?:匹配前面子表达式零次或一次
{n}:匹配 n 次。如:o{2} 不能匹配 bob 中的 o,但能匹配 food 中的两个 o
{n,}:至少匹配 n 次。如:o{2} 不能匹配 bob 中的 o,但能匹配 fooood 中的所有 o
{n,m}:其中 n<=m,最少匹配 n 次且最多匹配 m 次
?:非贪心量化(Non-greedy quantifiers):当该字符紧跟在任何一个其他重复修饰符(*,+,?,{},{n,},{n,},{n,m})后面时,匹配模式是非贪婪的。
非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 oooo,o+? 将匹配单个 o,而 o+ 将匹配所有 o。
.:匹配除 \n 之外的任何单个字符。要匹配包括 \n 在内的任何字符,要使用像 (.|\n) 的模式
(pattern):匹配 pattern 并获取这一匹配的子字符串。
[^xyz]:排除型字符集合。匹配未列出的任意字符
[a-z]:字符范围。匹配指定范围内的任意字符
[^a-z]:匹配任何不再指定范围内的任意字符
\b:匹配一个单词边界,也就是指单词和空格间的位置。如,er\b 可以匹配 never 中的 er,但不能匹配 verb 中的 er。
\B:匹配非单词边界。如,er\B 可以匹配 verb 中的 er,但不能匹配 never 中的 er。
\cx:匹配由 x 指明的控制字符。如,\cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z之间,否则将 c 视为一个原义的 c 字符。
\d:匹配一个数字字符。注意,Unicode 正则表达式会匹配全角数字字符。
\D:匹配一个非数字字符。
\f:匹配一个换页符。等价于 \x0c 和 \cL
\n:匹配一个换行符。等价于 \x0a 和 \cJ
\r:匹配一个回车符。等价于 \x0d 和 \cM
\s:匹配任何空白字符,包括 空格、制表符、换页符。等价于 [\f\n\r\t\v]。注意 unicode 正则表达式会匹配全角空格符
\S:匹配任何非空白字符。
\t:匹配一个制表符。等价于 \x09 和 \cl
\v:匹配一个垂直制表符。等价于 \x0b 和 \cK
\w:匹配包括下划线的任何单词字符。等价于 [A-Za-z0-9]。注意 unicode 正则表达式会匹配中文字符
\W:匹配任何非单词字符。
\ck:匹配控制转义字符。k 代表一个字符。等价于 Ctrl-K
正则优先级
最高:\
高:()、(?:)、(?=)、[]
中:*、+、?、{n}、{n,}、{n,m}
低:^、$、中介字符
次最低:串接(即相邻字符连接在一起)
最低:|
3.7.反爬技巧与绕过手段
3.7.1.header 检测与绕过
1.常用 header 头
Accept:指定客户端能够接收的内容类型。如,Accept: text/plain, text/html
Accept-Charset:浏览器可以接受的字符编码集。如,Accept-Charset: iso-8859-5
Accept-Encoding:指定浏览器可以支持的 web 服务器返回内容压缩编码类型。如,Accept-Encoding: compress, gzip
Accept-Language:浏览器可接受的语言。如,Accept-Language: en,zh
Connection:表示是否需要持久连接(HTTP 1.1 默认进行持久连接)。如,Connection: close
Content-Length:请求的内容长度。如,Content-Length: 348
Content-Type:请求的实体对应的 MIME 信息。如,Content-Type: application/x-www-form-urlencoded
Referer:从什么地方来。如:Referer: http://www.zcmhi.com/archives/71.html
2.无 header
#coding:utf-8 from requests import * from re import *url = 'https://www.zhihu.com/'r=get(url).text print(r)运行结果可能是 400
3.加 header 绕过
#coding:utf-8 from requests import * from re import *url = 'https://www.zhihu.com/' header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36'} r=get(url,headers=header).text print(r)
获取正常数据
3.7.2.cookie 加密
#coding:utf-8 from requests import * from re import *url = 'http://192.168.1.5/a.php/'cookie={'PHPSESSID':'xxxx'}
data={'token':'xxx','type':'7'} r=post(url,cookies=cookie,data=data).text print(r)
3.7.3.验证码
1.使用验证码接口
2.编写验证码识别库
3.7.4.ban IP
换代理