
robots.txt 协议 君子协定
eg1:
from urllib.request import urlopen
url = "http://www.baidu.com"
urlopen(url)
resp = urlopen(url)
with open("mybaidu.html", mode="w",encoding= "utf-8")as f: #创建一个文件
f.write(resp.read().decode("utf-8"))
print("over!")
1.Web请求过程剖析
服务器渲染:在服务器那边直接把数据和html整合在一起,统一返回给浏览器
在页面源代码中能看到数据
客户端渲染:第一次请求只要一个html骨架,第二次请求拿到数据,进行数据展示
在页面源代码中看不到数据
熟练使用浏览器抓包工具
2.Http协议超文本协议 Hyper Text Transfer Protocol
请求:
请求行 -> 请求方式(get/post) 请求url地址 协议 请求头 -> 放一些服务器要使用的附加信息 请求体 -> 一般放一些请求参数
响应:
状态行 -> 协议 状态码等200 404 302 响应头 -> 放一些客户端要使用的一些附加信息 响应体 -> 服务器返回的真正客户端要用的内容(HTML,json等)
请求头中爬虫需要:
1.user-agent:请求载体的身份标识
2.Referer:防盗链(这次请求是从哪个页面来的?反爬会用到)
3.cookie:本地字符串数据信息(用户登录信息,反爬的token)
响应头中的一些重要内容:
1.cookie:本地字符串数据信息(用户登录信息,反爬的token)
2.各种字符(需要经验)
请求方式:GET POST
3.Requests入门安装:pip install requests 清华大学国内源
#eg1: GET请求
import requests
query = input ("输入一个你喜欢的明星")
url = f'https://www.sogou.com/web?query={query}' #f的用法
dic ={
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
}
resp = requests.get(url,headers = dic)
print(resp.text)
#eg2:针对POST请求
import requests #POST
url='https://fanyi.baidu.com/sug'
s = input("Please input your word")
dat ={
"kw":s
}
resp = requests.post(url,data = dat)
print(resp.json)
#eg3:
import requests
url ='https://movie.douban.com/j/chart/top_list'
#重新封装参数
param = {
"type": "25",
"interval_id": "100:90",
"action": "",
"start": "0",
"limit": "20",
}
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
}
resp = requests.get(url = url ,params=param,headers= headers)
print(resp.json())
resp.close() #关掉resp
4.数据解析
1.re解析 Regular expression
2.bs4解析
3.xpath解析
这三种方式可以混合进行使用,完全以结果做导向,之后再考虑性能
正则表达式
正则的语法:使用元字符进行排列组合用来匹配字符串。
测试:https://tool.oschina.net/regex/ 开源中国提供
元字符:具有固定含义的特殊符号
常用元字符: 每个元字符默认匹配一位字符串
. 匹配除换⾏符以外的任意字符 w 匹配字⺟或数字或下划线 s 匹配任意的空⽩符 d 匹配数字 n 匹配⼀个换⾏符 t 匹配⼀个制表符 ^ 匹配字符串的开始 $ 匹配字符串的结尾 W 匹配⾮字⺟或数字或下划线 大写为反义 D 匹配⾮数字 S 匹配⾮空⽩符 a|b 匹配字符a或字符b () 匹配括号内的表达式,也表示⼀个组 [...] 匹配字符组中的字符 eg:[a-zA-Z0-9_] [^...] 匹配除了字符组中字符的所有字符
量词:控制前面的元字符出现的次数
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
贪婪匹配和惰性匹配 爬虫常用
.* 贪婪匹配 选择长的一项 .*? 惰性匹配 选择短的一项 (回溯算法)5.re模块
import re
#匹配字符串中所有的符合正则的内容
list = re.findall(r"d+","我的电话号是:10086")
print(list)
#finditer :匹配字符串中所有的内容(返回的是迭代器),从迭代器中拿到的内容需要.group()
it = re.finditer(r"d+","我的电话号是:10086")
for i in it:
print(i.group())
# search,找到一个结果就返回,返回的结果是match对象,拿数据需要.group()
s = re.search(r"d+","我的电话号是:10086,我女朋友的电话是:10010")
#match是从头开始匹配
#预加载正则表达式 compile() 方便后面的使用
obj = re.compile(r"d+")
ret = obj.finditer("我的电话号是:10086,我女朋友的电话是:10010")
for it in ret:
print(it.group())
ret = obj.findall("呵呵哒,我就不信你不换我1000000000000")
print(ret)
import re s = """ 艾林艾德勒 福尔摩斯 莫里亚蒂 麦克罗夫特 """ # re.S: 让.能匹配换行符 (?P<分组名字>正则) 可以单独从正则匹配的内容中进一步提取内容 obj = re.compile(r"d+)'>(?P.*?)",re.S) result = obj.finditer(s) for it in result: print(it.group("name")) print(it.group("id"))
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)