免责声明
技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他!譬如收集大规模集群(包括网络设备、操作系统、应用程序)的监控数据并进行存储。查询使用本文所提供的信息或工具即视为同意本免责声明,并承诺遵守相关法律法规和道德规范
HTTP协议
请求
1.请求行 -> 请求方式{get/post} 请求url地址 协议,一些反扒内容 2.响应头 -> 放一些服务器使用的附加信息 3 4.请求体 -> 一般放一些请求参数
响应
1.状态行 -> 协议 状态码 {eg:200 403 404} 2.响应头 -> 放一些客户端需要使用的一些附加信息 3. 4.响应体 ->服务器返回短的真正客户端要用的内容{HTML,JS...}
请求头及响应头一般隐含着比较重要的内容
请求头;
1.UA头:请求载体的身份标识(用啥发送的请求) 2.referer:防盗链(这个请求从哪个页面来的{反爬用}) 3.cookie;本地字符串数据信息(用户登录信息,反爬的token)
响应头;
1.cookie;本地字符串数据信息(用户登录信息,反扒的token) 2.各种莫名其妙的字符串(一般是token字样,繁殖攻击与反爬)
requests;
import requests # 导入requests模块 query = input("你想要得到的") url = f'https://www.sogou.com/web?query={query}' dlc = { # 建立UA头 "User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; Tablet PC 2.0; wbx 1.0.0; wbxapp 1.0.0; Zoom 3.6.0)", } resq = requests.get(url, headers=dlc) # 以GET请求运行requests,url为目标,headers为要引用的头文件 print(resq) # 输出状态码 print(resq.text) # 输出网站HTML源代码
实列
利用requests获得百度翻译结果
url = "https://fanyi.baidu.com/sug" word = input("要翻译的单词") heads = { # 输入目标单词的参数 "kw": word } # 发送POST请求,发送的数据必须放在字典中,并通过data参数进行传递 resp = requests.post(url, data=heads) # json:Python原生支持JSON数据。Python json模块是标准库的一部分。该json模块可以将JSON数据从JSON格式转换到等效的Python对象,例如dictionary和list。JSON # 模块还可以将Python对象转换为JSON格式。 print(resp.json())
爬取豆瓣电影排行榜
url = "https://movie.douban.com/j/chart/top_list" # 输入参数 for a in range(0, 100, 20): dica = { "type": "24", "interval_id": "100:90", "action": "", "start": a, "limit": 20, } head = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.1.2 Safari/537.36 JiSu/118.0.1.2Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.1.2 Safari/537.36 JiSu/118.0.1.2", } resp = requests.get(url=url, params=dica, headers=head) print(resp.json()) resp.close() # 关闭resp
正则
元字符
. 匹配除换行符以外的任意字符 \w 匹配字海或数字或下划线 \S 匹配任意的空白符 \d 匹配数字 \n 匹配一个换行符 \t 匹配一个制表符 \^ 匹配字符串的开始 \$ 匹配字符串的结尾 \W{大写} 匹配非字母或数字或下划线 \D 匹配非数字 \S{} 匹配非空白符 a|b 匹配字符a或字符b () 匹配括号内的表达式,也表示一个组 [ ...] 匹配字符组中的字符 [^...] 匹配除了字符组中字符的所有字符
量词
* 重复零次或更多次 + 重复一次或更多次 ? 重复零次或一次 {n} 重复n次 {n,} 重复n次或更多次 {n,m} 重复n到m次
贪婪匹配&惰性匹配
.* 贪婪匹配 .*? 惰性匹配
eg:
# findall: 匹配字符串中所有符合正则的内容 lst = re.findall(r"\d+", "1231123去去去") print(lst) # finditer: 匹配字符串中所有的内容[返回的使迭代器],获取内容需要拼接.group() it = re.finditer(r"\d+", "1231123去去去") for i in it: print(i.group()) # search,找到一个结果就返回,拿到数据拼。group them = re.search(r"\d+", "1111112222,123123") print(them.group()) # match 从头开始匹配,可以认为加了一个^ ii = re.match(r"\d+", "!1231123去去去") print(ii.group()) # 预加载正则 obj = re.compile(r"\d+") it = obj.finditer(r"\d+", "1231123去去去") for i in it: print(i.group()) # (?P<组名>re) 可以单独从正则匹配的内容中获得 组名 内的数据 obj = re.compile(r"123123(?P<a2>.*?)123123", re.S) # re.S 使”.“可以匹配换行符 a1 = obj.finditer("123123qqqqq123123123") for a in a1: print(a.group("a2"))
实列:
爬取豆瓣TOP250
# 导入 request,re,csv模块 import requests import re import csv # 使start以0为起始,以25为公差,275为结点(不包括275) for start in range(0, 275, 25): url = f'https://movie.douban.com/top250?start={start}' head = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.1.2 " "Safari/537.36 JiSu/118.0.1.2Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko)" "Chrome/118.0.1.2 Safari/537.36 JiSu/118.0.1.2", } ress = requests.get(url, headers=head) a1 = ress.text # 构造re,提取关键点,re,S为:“.”可以匹配换行符 obj = re.compile(r'<div class="item">.*?<span class="title">(?P<name>.*?)' r'</span>.*?<div class="star">.*?<span property="v:best" content="10.0">.*?<span>' r'(?P<people>.*?)</span>.*?<span class="inq">(?P<word>.*?)</span>', re.S) a2 = obj.finditer(a1) # # 使用csv 将提取到的内容追加(a+)写入csv文件内 f = open("name.csv", 'a+', encoding='UTF-8', newline='') write = csv.writer(f) for i in a2: # 此处为测试用 # print(i.group("name")) # print(i.group("people")) # print(i.group("word").strip()) dic = i.groupdict() dic['word'] = dic['word'].strip() write.writerow(dic.values()) # 关闭程序 f.close() print("over!")