robots君子协议: 网站中哪些数据不可以被爬取 http协议: 常用请求头信息: user-Agent:请求载体的身份标识 connection:请求完毕后,断开还是保持连接 常用响应头信息 connection-Type:服务器响应回客户端数据类型 https: 安全的超文本传输协议 加密方式: 对称密钥加密: 非对称密钥 证书密钥 requests模块: urllib模块 requests模块 requests模块: python中原生的基于网络请求的模块,功能强大,简单便捷,效率极高 作用:模拟浏览器发请求。 如何使用: 1.指定url 2.发起请求 3.获取响应数据 4.持久化存储 安装环境 pip install requests 爬取搜狗首页数据 import requests if __name__ == '__main__': url = 'https://www.sogou.com/' 指定url # requests.get(url) response = requests.get(url=url) 发送请求,get 方法会得到一个响应对象 page_text = response.text 获得响应数据,text方法返回字符形式的响应数据 print(page_text) 持久化存储 with open('./sogou.html', 'w', encoding='utf-8') as fp: fp.write(page_text) print('爬取结束') 案例:网页采集器 UA伪装:让爬虫对应的身份载体伪装为某一浏览器 import requests url = 'https://sogou.com/web' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.12151 SLBChan/103' } kw = input('请输入一个词') param = { 'query': kw } res = requests.get(url=url, params=param, headers=headers) page_text = res.text filename = kw+'.html' with open('E:/爬虫/'+filename, 'w', encoding='utf-8') as fp: fp.write(page_text) print('完成') 破解百度翻译 post 返回json import requests import json post_url = 'https://fanyi.baidu.com/sug' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.12151 SLBChan/103' } kw = input('请输入一个单词') data = { 'kw': kw } res = requests.post(url=post_url, data=data, headers=headers) dic_obj = res.json() filename = f'E:/爬虫/{kw}的意思.json' fp = open(filename, 'w', encoding='utf-8') json.dump(dic_obj, fp=fp, ensure_ascii=False) print('over') re模块: 正则表达式: 元字符 . 匹配除换行之外的所有字符 在re模块中需要注意 \w 匹配所有的字母跟数字跟下划线 \s 匹配任意空白符 \d 匹配任意数字 \n 匹配一个换行符 \t 匹配一个制表符 ^ 匹配一个字符串的开始 $ 匹配字符串的结尾 \W 匹配非字母数字下划线 \D 匹配非数字 \S 匹配非空白字符 a|b 匹配字符a或字符b () 匹配括号内的表达式,也表示一个组 [...] 匹配字符组中的字符 [^...] 匹配除了字符组中的字符 量词: * 重复0次或更多次 + 重复1次或更多次 ? 重复0次或更多次 {n} 重复n次 {n,} 重复n次或更多次 {n,m} 重复 贪婪匹配与惰性匹配 贪婪匹配: .* 惰性匹配: .*? re模块: import re # res = re.findall(r'\d+', '你好,我是200002,我今年18岁') # 前面写的是正则表达式,后面是要匹配的字符串 # res = re.finditer(r'\d+', '你好,我是200002,我今年18岁') # for item in res: # print(item.group()) # 返回的是迭代器,效率更高,使用频繁 # res = re.search(r'\d+', '我叫周杰伦,我32岁,3年纪2半') # print(res.group()) # search会匹配到第一次匹配的内容 res = re.match(r'\d+', '我叫周杰伦,我32岁,3年纪2半') print(res) # match在匹配的时候默认在前面加上了^ # 相当于^\d+ # print(res) 想要提取数据必须拿小括号括起来,也可以单独起名字 (?P<名字>正则) 提取数据的时候,需要group('名字') bs4: from bs4 import BeautifulSoup 导入元素(第三方库) html = """ <ul> <li><a href="zhangwuji.com">张无忌</a></li> <li id="abc"><a href="zhouxingchi.com">周星驰</a></li> <li><a href="zhubajie.com">猪八戒</a></li> <li><a href="wuzetian.com">武则天</a></li> </ul> """ page = BeautifulSoup(html, 'html.parser') 表示解析的是html page.find('li', attrs={'属性': '值'}) 查找某个元素,只会找到一个结果 a = li1.find('a') 也可以继续find print(a.text) 拿文本用text print(a.get('href')) 拿属性用get('属性') find_all(参数一样) 是找到所有结果 pyquery笔记 from pyquery import PyQuery html = """ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> <li class="aaa"><a href="www.baidu.com">百度</a></li> <li class="bbb"><a href="www.google.com">谷歌</a></li> <li class="ccc"><a href="www.qq.com">腾讯</a></li> <li id="ddd"><a href="www.hhh.com">哈哈哈</a></li> </ul> </body> </html> """ p = PyQuery(html) 把html加载进pyquery # a = p('li.aaa a').text() 拿到标签中的文本 # a2 = p('#ddd a').attr('href') #是id选择器,attr拿到a标签中的属性 # print(a) # print(a2) # 坑 # href = p('li a').attr('href') 只能打印第一个 # print(href) # 解决 # hrefs = p('li a').items() 用迭代器进行循环 # for item in hrefs: # href = item.attr('href') # text = item.text() # print(text, href) # 对于html结构的修改 p('li.aaa').after('<li class="aaa">哈哈哈</li>') after 是在标签后新增 p('li.bbb').append('<span>我爱你</span>') append是在标签内新增 p('li.ccc').attr('class', 'eee') attr属性修改 p('li.eee').attr('id', '12345') 新增id属性,前提是该标签没有这个属性 p('li.ddd').remove_attr('class') 移除属性 remove是删除标签 print(p) 代理格式 proxy = { 'http': 'http://118.190.244.234:3128', 'https': 'https://118.190.244.234:3128', }
网络爬虫基础笔记(1)
最新推荐文章于 2024-08-28 16:14:15 发布