python爬虫
request库的应用
- requests.get(url,params=None,**kwargs)
- url :获取url链接
- params :url中的额外参数,字典或字节流格式,可选
- **kwargs:12个控制访问的参数
首先建立一个对象r:
r=requests.get(“这里面写的是网址!”)
requests 对象的属性有:
- r.status_code 如果出现200就是成功 出现其他的就是失败!
- r.encoding :如果header 中不存在charset ,则认为编码为ISO-8859-1
- r.apparent_encoding:根据网页内容分析出编码的方式 ,可以看做是r.encoding的备选
- r=requests.get(url) 连接他又风险 异常处理很重要!
requests.request(method,url,**kwargs)(不常用了,一般直接用函数)
- method : 请求方法
**kwargs :控制访问的参数 :
- params : 字典或者字节序列,作为参数加到url 中
例如:
2.data :字典,字节序列或文件对象,作为Request的内容
data 的用法有:在用post的方法时,在网页F12获取network,head 里的from data 这个就是相关的请求,吧form data 赋值在里面就会获取相关的请求,
但是记得也要改一下url 的链接,是哪一个url 链接的请求
3.json :JOSN的格式的数据,作为Request的内容
4.headers:字典,HTTP定制头
5.files:字典类型,传输文件
6.timeout :设定超时时间,秒为单位
7.proxies:字典类型,设定访问代理服务器,不让别人知道我们的地址,防止自己的地址被封!
**kwargs其他的参数:
request的函数
- requests.get(url,params=None,**kwargs) 可以用的参数:(都可用!)
- request.head(url,**kwargs)
*request.post(url,data=None,json=None,**kwargs)
data 的用法有:在用post的方法时,在网页F12获取network,head 里的from data 这个就是相关的请求,吧form data 赋值在里面就会获取相关的请求,
但是记得也要改一下url 的链接,是哪一个url 链接的请求
- request.put(url,data=None,**kwargs)
- requests.patch(url,data=None,**kwargs)
requests.delete(url,**kwargs)
需要登录页面的请求(cookie )(session)
当需要输入账号的时候可以用session发送post请求------>但是他就是保存了cookie ,用headers 里面加上 cookies 更加方便! 也可以直接在requests的参数中增加cookies 参数 但是要把cookie转化字典.
session一般步骤
import requests
#实例化一个session
session=requests.session()
# 2.用post请求 在登录网页请求
response=session.post(url="url 地址",headers="请求头 ,cookie ,之前的网页",data="表单信息 密码什么的")
# 3. 现在就可以用get 请求获取登录后的网页
r=session.get("....")
处理不信任的SSL 证书:
加一个参数 verify
import requests
r=requests.get("网站",verify=False)
不使用session 直接在headers加cookies或者直接增加参数 cookies
也可以直接在requests的参数中增加cookie 参数 但是要把cookie转化字典.(麻烦了 直接把cookies 放在 headers方便多了)
post请求的查询:
1.找到需要post请求的url,
2.找到需要post 请求的data 里面的数据
按照 from data 里面的数据格式 获取 数据在提交到post请求的data里面去
3.r=requests.post(url="",data="") ==>url 是要请求的地址,data 是 从 form data 获取的相关数据
url解码的方法
解码 requests.utils.unquote()
设置码:requests.utils.quote()
requests 小技巧;
代理 (防止被封)
proxy={
"http":'58.249.55.222.9797'
}
r=requests.get(url="你要爬的网页",proxies=proxy)# 这里的proxy 就是代理网站
requests 经常用的 东西:
r=requests.get()
r.text #获得文本
r.content.decode("utf-8") # 用二进制解码到 utf-8
r.content # 这个是用来存照片或者存视频时候用的东西
r.url # 看响应头
r.encoding # 看字符编码
r.status_code # 看响应码
用params 在url 上面添加相应的参数:
params={
wd:"中国"
}
r=request.get(url="https://www.baidu.com/",params=params)
Beautiful Soup
- 基础:
- 先使用 requests 库 建立一个demo 之后都会用到.
- 美化提取的HTML
*使用 prettify
from bs4 import BeautifulSoup
soup=BeautifulSoup(demo,"html.parser") # 这个 demo 是之前建立的
print(soup.a) # 获取 a标签和a标签里面的内容 <a>内容</a>
print(soup.a.name) # 获取标签的名字 我自己觉得没什么用
print(soup.a.attrs) # 获取 一个字典类型,内容a里面是标签的属性,
print(soup.a.attrs["class"]) # 只获取a里面class的属性
print(soup.a.string) # 获取a里面的字符
接下来是例子:
总结:
基于bs4库的html内容遍历的方法:
一共有三种遍历:下行遍历,上行遍历,平行遍历
- 下行遍历
下行遍历的例子:
for child in soup.body.children:
print(child) # 遍历儿子节点
for child in soup.boy.descendants:
print(child) # 遍历子孙节点
上行遍历:
例子:
soup =BeautifulSoup(demo,"html.parser")
for parent in soup.a.parents:
if parent is None:
print(parent)
else:
print(parent.name)
输出:
p
body
html
[docment]
平行遍历:
什么是平行遍历,需要注意的是:
例子:
标签树的平行遍历:
for sibling in soup.a.next_sibling:
print(sibling) # 遍历后续节点
for sibling in soup.a.previous_sibling:
print(sibling) #遍历前续节点
遍历总结:
BeautfulSoup 的find_all() 方法
<>.find_all(name,attrs,recursive,string,**kwargs)
<>这个是指BeautfluSoup 煮的一碗汤
他返回的是一个列表类型,存储查找的结果
.name :对标签名称的检索字符串(标签名)
.attrs: 对标签属性值的检索字符串们可以标志属性检索
.recursive:是对子孙全部索引,默认是True,(意思就是默认查询他的所有子孙)
.string: 把<>…</>中的字符串区域的检索字符串
注意: 因为find_all经常用所有可以简写 不用写find_all
例如:
<tag>(...) 等价于 <tag>.find_all(..)
soup(..) 等价于 <soup.find_all>
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
方法 | 说明 |
---|---|
<>.find() | 搜索且返回一个结果,同.find_all()参数 |
<>find_parents() | 在先辈节点中搜索,返回列表类型,同.find_all |
<>.find_parent() | 在先辈节点中返回一个结果,同.find()参数 |
<>.find_next_siblings() | 在后续平行节点中搜索返回列表类型,同.find_all参数 |
<>.find_next_sibling() | 在后续平行节点中返回一个结果,同.find() 参数 |
<>.find_previous_siblings() | 在前序平行节点中搜索,返回列表类型,同find_all()参数 |
<>.find_previous_sibling() | 在前序平行节点中返回一个结果,同find() 参数 |
find_all 的关键用法:
1.查找符合要求的a标签
alist=soup.find_all("a",id="test",class="text") # 这个就是找打a标签 然后 id 等于 "test" class等于 "text"
2.获取a标签的href属性
alist=soup.find_all('a')
for a in alist:
(1) 通过下表操作
href=a['href']
(2)通过attrs['href']获得
href=a.attrs['href']
3.获取文本
(1) 获取title 标签的文本
title.string
(2)title.strings 这个也可以获取文本,获取所有非标签的字符串
(3)title.stripped_strings 获取不是换行的标签
(4) title.text 也可以获取文本
(5)title.contents 有多行也可以去取到
css 选择器
在beautifulsoup中使用css选择器,那么应该使用soup.select() 方法,应该传递一个css 选择器的字符串给select方法
soup=BeautifulSoup(html,'lxml')
1.获取所有的tr 标签
trs=soup.select('tr')
2.获取第二个tr标签
trs=soup.select('tr')[1]
3.获取所有class 等于evevn 的tr 标签
trs=soup.select('tr[class="even"]')
for tr in strs:
print(tr)
4.找到class 为panel 属性的标签 下面的 class 属性为panel-heading
print(soup.select('.panel .panel-heading'))
5.找到 ul 下面的 所有li(子孙标签都找到)
print(soup.select('ul li'))
6.找到 id 为 list-2 下面的 class 为 element 的标签
print(soup.select('#list-2 .element'))
7.找到 ul 下面的li的儿子标签 不包含 孙子标签
print(soup.select('ul>li'))
8.找到 div class 等于panel-body 下面的 ul 下面的 li
print(soup.select('div[class="panel-body"] ul li'))
使用BeautifulSoup的一些注意点:
存在bs4.element.NavigableString和bs4.element.Comment导致使用.string时出现None.(有注释和内容的时候:使用string 会出现None)
因为string识别不出是注释和文字内容 所以要用:.comments[0],comments[1]…等等去取到相关数据
在html 页面中存在br 标签使用 .string 导致出现None 的时候
现在可以用replace 的方法来除去标签中的
标签
或者直接用text
re 库的使用!
re库默认采用贪念模式,就是匹配到多个可用的字符,输出最长的字符。
想要最小的时候可以进行这项操作 加问号(?):
re 的. (点) 不能匹配到换行如要 让他取到换行符需要加 re.DOTALL
t=re.findall(r'正则表达式','字符串',re.DOTALL) # 这样 . 就可以匹配到换行了
基本用法:
一些常用的例子:
string 来表示
search:
要用.group(0),.group(1)…来获取对象
match:
findall:
split:
finditer:
它的迭代类型可以用for循环出来!
re.sub:
re库的另一种写法:
compile:
之前的 match 对象的属性:
match对象是一次匹配的结果,包含匹配的很多信息
实例: