网页爬虫知识点总结
1.什么是爬虫?
爬虫就是:模拟浏览器发送请求,获取响应
2.爬虫的分类,爬虫的流程
- 聚焦爬虫:针对特定的网站的爬虫
- 准备url地址 –>发送请求 获取响应–> 提取数据–> 保存
- 获取响应–> 提取url地址,继续请求
- 通用爬虫:搜索引擎的爬虫
- 抓取网页–> 数据存储–>预处理–> 提供检索服务,网站排名
3.浏览器发送请求的过程
- 爬虫请求的:url地址对应的响应
- 浏览器获取到的内容:elements的内容=url对应的响应+js+css+图片
- 爬虫获取的内容和elements内容不一样,进行数据提取的时候,需要根据url地址对应的响应为准进行数据的提取
4.http的请求头user-agent有什么用
- user-agent:告诉对方服务器是什么客户端正在请求资源,爬虫中模拟浏览器非常重要的一个手段
- 爬虫中通过把user-agent设置为浏览器的user-agent,能够达到模拟浏览器的效果
- cookie:获取登录只有才能够访问的资源
5.利用requests模板如何发送请求和获取响应
- response = requests.get(url)
- response.text -> str # 根据响应信息进行有规律的推测网页的编码
- response.encoding=“utf-8”
- response.encoding=”gbk”
- response.content -> bytes
- response.content.decode(“utf8”)
# 发送请求,获取响应
def parse(self, url, data):
response = requests.get(url,params=params,headers=self.headers)
response = requests.post(url,data=data, headers=self.headers)
return response.content.decode()
- response.content.decode(“utf8”)
- response.status_code
- response.request.headers
- response.headers
- 一般来说名词,往往都是对象的属性,对应的动词是对象的方法
- 获取网页源码的通用方式:
- response.content.decode() 的方式获取响应的html页面
- response.content.decode(“GBK”)
- response.text
6.常见的状态响应码
- 200:成功
- 302:临时转移至新的url
- 307:临时转移至新的url
- 404:not found
- 500:服务器内部错误
二、
1.requests中headers如何使用,如何发送带headers的请求
- 模拟浏览器,欺骗服务器,获取和浏览器一致的内容
- headers = {“User-Agent”:“从浏览器中复制”}
- headers = {
“Origin”: “http://ntlias-stu.boxuegu.com”,
“Referer”: “http://ntlias-stu.boxuegu.com/”,
“User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.17 Safari/537.36”
} - requests.get(url,headers=headers)
2.发送带参数的请求
params = {"":""}
url_temp = “不完整的URL地址”
requests.get(url_temp,params=params)
3.requests如何发送post请求
data = {“从浏览器中form data的位置寻找”}
requests.post(url,data=data)
4.requests中如何使用代理,使用代理的目的,代理的分类
-
proxies = {“https”: “https://117.127.0.195:8080”}
-
proxies = {协议:协议+ip+端口}
-
requests.get(url,proxies=proxies)
目的:
- 反反爬
- 隐藏真实ip
代理的分类
- 高匿名代理:不知道在使用代理
- 匿名代理:知道在使用代理,但是不知道真实ip
- 透明代理(Transparent Proxy):对方知道真实的ip
5.requests中session类如何使用,为什么要使用session
- session = requests.Session()
- session.post(url,data) #cookie会保存在session中
- session.get(url) #用session发送请求会带上之前的cookie
- 注意:这块的session类和之前所学的session无任何关系
三、
1.requests进行携带cookie登录
- cookie字符串放在headers中
- 把cookie字典交给requests请求方法的cookies
2.寻找登录接口的方法
- form表单action对应的url地址
- 用户名和密码的input标签中,name的值作为键,用户名和密码作为值的字典,作为post data
- 通过抓包,定位url地址
- form data
3.分析js,获取加密的数据
- 观察变化
- 定位js
- 通过event listener定位js的位置
- 通过搜索url地址中的关键字,通过chrome的search all file来进行搜索
- 进行分析
- 通过添加断点的方式分析js
- 执行js
- 完全的使用python模拟js的执行过程
4.requests处理ssl证书
requests.get(url,verify=False)
5.获取响应中的cookie,转化为字典
response = requests.get(url,headers=headers) requests.utils.dict_from_cookiejar(response.cookies)
5.数据的分类
- 结构化数据 json, xml
- 直接使用模块转化为python类型
- 非结构化数据 html
- re,xpath
8.json模块的使用
- 数据交换格式
- json.loads(json_str) json字符串转化为python类型
- json.dumps(python_type,ensure_ascii=False,indent=2) python类型转化为json字符串
- json.load() 把包含json的类文件对象中的数据提取出来转化为python类型
- json.dump() python类型存入类文件对象中
- 那么对于为什么需要模拟登陆?
获取cookie,能够爬取登陆后的页面
9.requests模拟登陆的三种方法
- session
- 实例化对象
- session.get(url) #cookie保存在session中
- session.get(url) #带上保存在session中cookie
- cookie方法headers中
- cookie传递给cookies参数
- cookie = {“cookie 的name的值”:“cookie 的value对应的值”}
10.三元运算符
a = 10 if 3<2 else 100
11.字典推导式
{i:i+10 for i in range(10)} {0: 10, 1: 11, 2: 12, 3: 13, 4: 14, 5: 15, 6: 16, 7: 17, 8: 18, 9: 19}
{i:i+10 for i in range(10) if i%2==0} {0: 10, 2: 12, 4: 14, 6: 16, 8: 18} 12345
四、
1.正则的语法
- 字符
- . 能够匹配n之外的所有字符 re.S模式下可以匹配n
- 转义
- [] 或的效果,从中选择一个, [abc]+ 能够匹配多个
- | 或的效果
- 预定义的字符集
- d 数字
- s 空白字符串,包含空格、n,t
- w 单词字符,a-zA-Z0-9_
- 数量词
-
- 匹配0次或者多次
-
- 能够匹配1次或者多次
- ? 能够匹配0-1次,让*,+非贪婪
-
2.re模块的常用方法
- re.findall(“正则表达式regex”,“待匹配的字符串”) # 返回列表,或者是空列表
- re.sub(“regex”,"_",“待替换的字符串”) # 返回字符串
- p = re.compile(“regex”,re.S/re.DOTALL) # 返回一个p模型,编译,提高匹配效率
- p.findall(“待匹配的字符串”)
- p.sub("_",“待替换的字符串”)
注:re.S 匹配n re.DOTALL 匹配Tab键
3.原始字符串r
- 定义:相对于特殊符号而言,表示特殊符号的字面意思
- 用途:
- 正则中,能够忽略转义符号带来的影响,待匹配的字符串中有几个,正则表达式中加上r,照着几个即可
- windows文件路径
4.xpath语法
- xpath的安装 pip install lxml
- // 的用途
- //a html中所有的a
- div//a div中所有的a,包括div下的后代节点中的a
- a//text() a下的所有的文本
- @ 的使用
- a/@href 获取a的href的值
- //a[@class=‘b’]
- text() 的使用
- //a/text() 获取所有的a下的文本
- //a[text()=‘下一页’] 获取文本为下一页的a标签
- a//text() a下的所有的文本
- xpath包含的语法
- //div[contains(@class,“i”)] class包含i的div标签
- //a[contains(text(),“下一页”)] 文本包含下一页的a标签
- 兄弟标签
- /a/follow-sibling::ul[1]
- xpath 选择特定位置
- //a[1] 第一个
- //a[last()] 最后一个
- //a[last()-1] 倒数第二个
- //a[postion()<4] 前三个
5.lxml模块的使用
from lxml import etree element = etree.HTML(bytes/str) #返回element ret_list = element.xpath("xpath字符串") #返回列表 bytes = etree.tostring(element) #返回bytes类型字符串 #数据提取时:先分组,再提取 12345
五、
1.xpath包含的语法
//div[contains(@class,“i”)] class包含i的div标签
//a[contains(text(),“下一页”)] 文本包含下一页的a标签
2.url地址解码的方法
- requests.utils.unquote(url)
3.准备url地址
- 知道url地址的规律,知道一共多少页,准备url列表,果壳,糗百
- 不知道url地址规律,或者不知道一共多少页,准备start_url ,贴吧
4.多线程爬虫
- threading
- t1 = threading.Thread(targe=func,args=(,))
- t1.setDaemon(True) #设置为守护线程
- t1.start() #此时线程才会启动
- 队列
- from queue import Queue
- q = Queue()
- q.put() 队列计数+1
- q.get() 队列计数不会-1
- q.task_done() 和get()方法配合,队列计数-1
- q.join() #阻塞主线程,让主线程等待队列任务结束之后在结束,队列任务在计数为0时技术
5.多进程爬虫
- multiprocessing
- p = multiprocessing.Process(trage=func,args=(,))
- p.daemon = True #设置为守护进程,主线程结束,子进程结束
- p.start()
- from multiprocessing import JoinableQueue
- q = JoinableQueue()
- q.join() # 让主进程阻塞,等待队列任务计数,计数为0队列任务结束,
- q.put() # 计数+1
- q.get() # 计数不会-1
- q.task_done() # get和task_done一起使用才会减一
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试