为什么学习requests,而不是urllib
1.requests的底层就是urllib
2.requests在Python2和Python3中通用,方法完全一样
3.requests简单易用
4.requests能够自动帮助我们解压(gzip压缩的等)网页内容
url编码
http://www.baidu.com/s?wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2
字符串格式化的另一种方式
"传{}智播客".format(1)
保存页面
with open('renren1.html','w',encoding='utf-8') as f:
f.write(response.content.decode())
保存图片
with open('1.png/jpg','wb') as png:
png.write(response.content)
字典推导式和列表推导式
cookies = '......network中的cookie'
#字典推导式
cookies = {i.split("=")[0]:i.split("=")[1] for i in cookies.split("; ")}
return [self.url_temp.format(i*50) for i in range(1000)]#主流写法
requests小技巧
print(requests.utils.dict_from_cookiejar(response.cookies))
response = requests.get('https://www.12306.cn/mormhweb',verify=False)
response = requests.get(url,timeout=10)
assert response.status_code==200
发送简单的请求
response = request.get(url)
发送post请求
使用代理
proxies = {
"http":"http://12.34.56.79:9527:80",或者
"https":"https://12.34.56.79:9527:80",
}
response = requests.get(url,proxies=proxies) (proxie的形式:字典)
携带cookie请求
#使用session发送post请求,cookie保存在其中
session.post(post_url,data=post_data,headers=headers)
#再使用session进行请求登录后才能访问的地址
r = session.get('http://www.renren.com/976812720/newsfeed/photo',headers=headers)
headers = {
'User-Agent':'...',
'Cookie':'...network中的cookie值'
}
cookies = '......network中的cookie'
#字典推导式
cookies = {i.split("=")[0]:i.split("=")[1] for i in cookies.split("; ")}
r=session.get('http://www.renren.com/976812720/newsfeed/photo',headers=headers,cookies=cookies)
ret1 = json.loads(html_str)
或者
with open('douban.json','r',encoding='utf-8') as f:
ret2 = f.read() (需要先读一下)
ret3 = json.loads(ret2)
print(ret3)
with open('douban.json','w',encoding='utf-8') as f:
f.write(json.dumps(ret1,ensure_ascii=False,indent=2))
(ensure_ascii=False在json中文显示中文,indent=2缩进两格,显示好看)
with open('douban.json','r',encoding='utf-8') as f:
ret4 = json.load(f) (直接转换)
print(ret4)
with open('douban.json','w',encoding='utf-8') as f:
json.dump(ret,f)
定义:用事先定义好特殊字符,组成“规则字符串”,表达对字符串的一种过滤逻辑
用途:较少的数据时使用正则,如一个价格
常用正则表达式的方法:
re.complie(编译)
re.match(从头找一个)
re.search(找一个)
re.findall(找所有)
re.sub(替换)
贪婪(.*):尽可能匹配多的字符
r = re.findall('<.+>',a,re.S) (从第一个<匹配到最后一个)
print(r)
非贪婪(.*?):尽可能少的数据,匹配完一个接着匹配下一个
r = re.findall('<.+?>',a,re.S) (从第一个<匹配到第二个,接着匹配下个)
print(r)
re .sub(替换)方法
a = 'chuan1zhi2 '
print(re.sub('\d','_',a))
re.complie(编译)方法
a = 'chuan1zhi2 '
p = re.compile('.',re.S) (编译后p可以调用re其他方法节省运行时间,如果有re.S,re.DOALL放这)
print(p.findall('\n'))
原始字符串r的用法:待匹配的字符串中看到什么就在正则表达式中写什么,能忽略\带有转译的影响
a = re.findall(r'a\\nb','a\\nb')
print(a)
r'a\nb' == 'a\\nb' (True)
f = open(r"C:\Users\1.txt","r") (如果没有r需要写\\)
()的使用:只匹配括号中的,括号前后定位和起过滤作用
re.findall(r'a(.*)bc','a\nbc',re.DOTALL)
输出:['\n']
双引号里有双引号加\
r".*?
(.*?)
" (提取h1=title里面p标签的所有数据)
lxml是一款高性能的Python HTML/XML解析器,我们可以利用Xpath来快速定位特定元素以及获取节点信息。XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
工具:
1.Chrome插件 Xpath Helper
2.开源的Xpath表达式编辑工具:XML Quire(xml格式文件可用)
3.Firefox插件 Xpath Checker
节点选择语法
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210604191327579.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l1YW4yMDE5MDM1MDU1,size_16,color_FFFFFF,t_70#pic_center
Xpath学习重点
ret3 = html.xpath("//li[@class='item-1']")
for i in ret3:
item = {}
item['title'] = i.xpath("./a/text()")[0] if len(i.xpath("./a/text()")) > 0 else None
item['href'] = i.xpath("./a/@href")[0] if len(i.xpath("./a/@href")) > 0 else None
print(item)