自动处理url编码、自动处理post请求参数、简化cookie和代理操作
pip install requests
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
requests.request():构造一个请求,支撑一下各方法的基础方法
requests.get():获取HTML网页的主要方法,对应于HTTP的GET
requests.head():获取HTML网页头信息的方法,对应HTTP的HEAD
requests.post():向HTML网页提交POST请求的方法,对应于HTTP的POST
requests.put():向HTML网页提交PUT请求的方法,对应于HTTP的PUT
requests.patch():向HTML网页提交局部修改请求,对应于HTTP的PATCH
requests.delete():向HTML网页提交删除请求,对应于HTTP的DELETE
method:请求方式,对应get/put.post等7种
url:拟获取页面的url链接
**kwargs:控制访问的参数,共13个
params:字典或字节序列,作为参数增加到url中
data:字典、字节序列或文件对象,作为Request的内容
json:JSON格式的数据,作为Request的内容
headers:字典,HTTP定制头
cookies:字典或CookieJar,Request中的cookie
auth:元组,支持HTTP认证功能
files:字典类型,传输文件
proxies:字典类型,设定访问代理服务器,可以增加登录认证
allow_redirects:True/False,默认为True,重定向开关
stream:True/False,默认为True,获取内容立即下载开关
verify:True/False,默认为True,认证SSL证书开关
cert:本地SSL证书路径
compile() 可以将⼀个正则进⾏预加载. ⽅便后⾯的使⽤
findall() 查找所有. 返回list
finditer(), 和findall差不多. 只不过这时返回的是迭代器(重点)
search() 会进⾏匹配. 但是如果匹配到了第⼀个结果. 就会返回这个结果. 如果匹配不上search返回的则是None
match() 只能从字符串的开头进⾏匹配
# re.I 使匹配对大小写不敏感
# re.L 做本地化识别(locale-aware)匹配
# re.M 多行匹配,影响 ^ 和 $
# re.S 使 . 匹配包括换行在内的所有字符
# re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
# re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
# (?P<分组名字>正则) 可以进一步提取内容
实战:
re模板爬取豆瓣电影排行
import re
import requests
import csv
url = 'https://movie.douban.com/top250'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.55'
}
respone = requests.get(url=url, headers=headers)
# 解析数据
obj = re.compile(r'.*?(?P.*?) .*?'
r'.*?
(?P.*?) .*?r'(?P.*?) .*?'
, re.S)
result = obj.finditer(respone.text)
for it in result:
print(it.group("name"))
print(it.group("year").strip())
print(it.group("score"))
f = open("data.csv", mode="w", encoding='utf-8')
csvwriter = csv.writer(f)
for it in result:
dic = it.groupdict()
dic['year'] = dic['year'].strip()
csvwriter.writerow(dic.values())
f.close()
print('over!')
respone.close()
pip install bs4
from bs4 import BeautifulSoup
resp = requests.get(url=url)
BeautifulSoup(resp.text, "html.parser")指定html解析器:bs4的HTML解析器
# find(标签, 属性=值) 意思是在html里⾯中查找 xxx标签, 并且标签的xxx属性必须是xxx值
table = page.find("p", class_="site-piclist_info_title") # class是python中属性
table = page.find_all("p", attrs={
"class": "site-piclist_info_title"})
# find_all()的⽤法和find()⼏乎⼀致. find()查找1个. find_all()查找html里⾯中所有的.
# 可以不断find去找想要的东西
实战
bs4抓取html
import requests
from bs4 import BeautifulSoup
import re
url = "https://www.iqiyi.com/dianying_new/i_list_paihangbang.html"
resp = requests.get(url=url)
# 解析数据
# 1.把网页源码交给BeautifulSoup生成bs4对象
page = BeautifulSoup(resp.text, "html.parser") # 指定html解析器:bs4的HTML解析器
# 2.从bs对象中查找数据 find(标签名,属性=值) find_all()
# table = page.find("p", class_="site-piclist_info_title") # class是python中属性
table = page.find_all("p", attrs={
"class": "site-piclist_info_title"})
# table = page.select('.title')
# 设置re模板
obj = re.compile(r'(?P.*?)' , re.S)
# 转换为字符串
str_list=[str(i) for i in table]
str=' '.join(str_list)
# 打印名字
result = obj.finditer(str)
for it in result:
print(it.group("name"))
bs4抓取壁纸
import requests
from bs4 import BeautifulSoup
import time
url = "https://www.umei.net/bizhitupian/weimeibizhi/"
resp = requests.get(url)
resp.encoding = 'utf-8'
# 解析数据
page = BeautifulSoup(resp.text, "html.parser") # 指定html解析器:bs4的HTML解析器
alist = page.find("div", class_="TypeList").find_all("a")
aurl = "https://www.umei.net"
for a in alist:
href = aurl + a.get('href') # 拿到子页面
child_resp = requests.get(href)
child_resp.encoding = "utf-8"
child_page = BeautifulSoup(child_resp.text, "html.parser")
list = child_page.find("p", align="center").find("img")
src = list.get("src") #拿到图片链接
img_resp = requests.get(src)
img_name = src.split("/")[-1]
with open("img/"+img_name, mode="wb") as f:
f.write(img_resp.content) # 图片内容写入文件 即保存图片
time.sleep(0.5)
pip install lxml
选取节点:
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
选取未知节点:
* | 匹配任何元素节点 |
@* | 匹配任何属性节点 |
node() | 匹配任何类型的节点 |
选取若干路径:
通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
使用步骤:
将要解析的html内容构造出etree对象
html = etree.HTML(resp.text)
使⽤etree对象的xpath()⽅法配合xpath表达式来完成对数据的提取
[@class=‘xxx’]属性选取 text()获取⽂本
实战
xpath抓取猪八戒数据
import requests
from lxml import etree
url = 'https://hebi.zbj.com/search/f/?type=new&kw=saas'
resp = requests.get(url)
# 丢给etree, ⽣成Element对象
html = etree.HTML(resp.text)
divs = html.xpath("/html/body/div[6]/div/div/div[2]/div[5]/div[1]/div")
for div in divs:
price = div.xpath("./div/div/a/div[2]/div[1]/span[1]/text()")[0].strip("¥")
title = "sass".join(div.xpath("./div/div/a/div[2]/div[2]/p/text()"))
print(price, title)