python 爬虫 day02
程序员文章站
2022-03-02 20:26:37
...
目录:
python 爬虫 day02
解析
数据分类
- 结构化数据
特点 : 有固定的格式 : HTML XML JSON等 - 非结构化数据
示例 : 图片 音频 视频,这类数据一般存储为二进制
with open(“girl.jpg”,”wb”) as f:
f.write(html)
正则表达式re
- 使用流程
- 创建编译对象 : p = re.compile(‘\d’)
- 对字符串匹配 : result = p.match(“123ABC”)
- 获取匹配结果 : print(result.group())
- 常用方法
- match(s) : 只匹配字符串开头,返回对象
- search(s): 从开始往后去匹配第一个,返回对象
- group() : 从match和search返回的对象中取值
- findall(s):全部匹配,返回一个列表
-
表达式
符号 作用 .
任意字符(不能匹配\n) […] 包含[]内容 A[BCD]E -> ABE ACE ADE \d 数字 \w 字母 数字 下划线 \s 空白字符 \S 非空白字符 * 前一个字符出现0次或多次 ? 0次或1次 + 1次或多次 {m} 出现m次 贪婪匹配 : 整个表达式匹配成功前提下,尽可能多的去匹配*
非贪婪匹配 : 整个表达式匹配成功前提下,尽可能少的去匹配* -
示例 :
import re s = """<div><p>仰天大笑出门去,我辈岂是蓬蒿人</p></div> <div><p>天生我材必有用,千金散尽还复来</p></div>""" # 非贪婪匹配 p = re.compile('<div>.*?</div>',re.S) result = p.findall(s) print(result) # 列表中2个元素 # 创建编译对象,贪婪匹配 p = re.compile('<div>.*</div>',re.S) result = p.findall(s) print(result) # 列表中1个元素
-
findall()的分组
- 解释 :先按整体匹配出来,然后再匹配()中内容,如果有2个或者多个(),则以元组方式去显示
-
例子:
import re s = "A B C D" p1 = re.compile('\w+\s+\w+') print(p1.findall(s)) # 1.按整体去匹配 ['A B','C D'] # 2.显示括号()中内容 ['A','C'] p2 = re.compile('(\w+)\s+\w+') print(p2.findall(s)) # 1.整体匹配 :['A B','C D'] # 2.显示括号内容 :[('A','B'),('C','D')] p3 = re.compile('(\w+)\s(\w+)') print(p3.findall(s))
Fiddler抓包工具
- 抓包设置
- 设置Fiddler抓包工具
- HTTPS : Tools -> HTTPS -> …from browsers only
–> Actions证书信任 - connections : 设置端口号 :8888
- HTTPS : Tools -> HTTPS -> …from browsers only
- 设置浏览器代理
Proxy SwitchOmega - 选项 - 新建情景模式 - HTTP 127.0.0.1 8888 - 应用
- 设置Fiddler抓包工具
- Fiddler常用菜单
- Inspector : 查看抓到数据包的详细内容
- 常用选项
- Headers : 客户端发送到服务器的header,包含web客户端信息 cookie 传输状态
- WebForm : 显示请求的POST的数据
- Raw : 将整个请求显示为纯文本
-
请求方式及案例
- GET(查询参数都在URL地址中显示)
- POST
- 特点 : 查询参数在Form表单里保存
- 使用
urllib.request.Request(url,data=data,headers=headers)
data : 表单数据data必须以 bytes 类型提交,不能是字典 -
案例 :有道翻译
- 利用Fiddler抓包工具抓取 WebForms 里表单数据
- 对POST数据进行处理 bytes 数据类型
- 发请求得响应
-
例子:
from urllib import request,parse import json # 处理表单数据 # Form表单的数据要放到字典中,然后再进行编码转换 word = input("请输入要翻译的内容:") data = {"i":word, "from":"AUTO", "to":"AUTO", "smartresult":"dict", "client":"fanyideskweb", "salt":"1536648321283", "sign":"1e7948e25551448dbfb7184f23dc126c", "doctype":"json", "version":"2.1", "keyfrom":"fanyi.web", "action":"FY_BY_REALTIME", "typoResult":"false" } # 把data转为 bytes 数据类型 # decode为字符串,encode为bytes data = parse.urlencode(data).encode("utf-8") # 发请求 得响应 # 此处URL为抓包工具抓到的 POST的URL url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule" headers = {"User-Agent":"Mozilla5.0/"} req = request.Request(url,data=data,headers=headers) res = request.urlopen(req) # result为json格式的字符串 result = res.read().decode("utf-8") # 把json格式的字符串转换为 Python字典 # json模块中的loads方法 :json格式字符串 -> Python字典 result_dict = json.loads(result) #print(result_dict) #{'type': 'ZH_CN2EN', # 'errorCode': 0, # 'elapsedTime': 0, # 'translateResult': [[{'src': '你好', 'tgt': 'hello'}]]} r = result_dict["translateResult"][0][0]["tgt"] print(r)
- json模块
json.loads("json格式的字符串")
作用 :把json格式的字符串 -> Python字典 -
Cookie模拟登陆
- Cookie和Session
cookie :通过在客户端记录的信息确定用户身份
session :通过在服务器端记录的信息确定用户身份 -
案例 :使用cookie模拟登陆人人网
- 获取到登陆信息的cookie(登陆1次抓包)
- 发请求得响应
- 例子:
from urllib import request url = "http://www.renren.com/967469305/profile" headers = {"Host":"www.renren.com", "Connection":"keep-alive", "Upgrade-Insecure-Requests":"1", "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "+ \ "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440."+ \ "106 Safari/537.36", "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,"+ \ "image/webp,image/apng,*/*;q=0.8", "Referer":"http://www.renren.com/SysHome.do", #Accept-Encoding: gzip, deflate "Accept-Language":"zh-CN,zh;q=0.9", "Cookie":"anonymid=jlxb586t8i3v0g; depovince=BJ; _r01_=1; "+ \ "JSESSIONID=abcqRp76SQcK0dfdzQhxw; ick_login=4165cad5-4fdc-4"+ \ "66c-a7d0-98e014715ff0; first_login_flag=1; ln_uact=13603263409;"+ \ " ln_hurl=http://head.xiaonei.com/photos/0/0/men_main.gif; login"+ \ "from=syshome; jebe_key=094486d9-6cd0-442c-a7d4-c9115c822ab7%7C20"+ \ "12cb2155debcd0710a4bf5a73220e8%7C1536653132046%7C1%7C153665313190"+ \ "4; wp_fold=0; wp=0; jebecookies=8314ca50-d39d-4df1-b9fa-ea391456cc"+ \ "38|||||; _de=4DBCFCC17D9E50C8C92BCDC45CC5C3B7; p=356eafd62d5adaeb9"+ \ "0370c13491ac9055; t=b963e2106aa3249e5289deba7f486e915; societyguest"+ \ "er=b963e2106aa3249e5289deba7f486e915; id=967469305; xnsid=3850523b" } req = request.Request(url,headers=headers) res = request.urlopen(req) html = res.read().decode("utf-8") print(html)
- Cookie和Session
requests模块
- 安装(Conda prompt终端)
1.(base) > conda install requests
(base) > pip install requests - 常用方法
- get() : 向网站发起请求,并获取响应对象
- 用法:response = requests.get(url,headers=headers)
- response的属性
- response.text :获取响应内容(字符串)
一般默认返回字符编码:ISO-8859-1
手动指定 :response.encoding = “utf-8” - response.content : 获取响应内容(bytes)
- 应用场景 :爬取图片、音频等非结构化数据
- 示例 :爬取百度美女图片
- 找URL
- response.status_code : 返回服务器响应码
- response.text :获取响应内容(字符串)
- get() : 向网站发起请求,并获取响应对象
上一篇: python基础——Day02
下一篇: zepto中$.each迭代器的实现