网络爬虫与信息提取
- VSCODE 开发工具
Requests 库自动爬去HTML页面 信息
安装requests库
使用requests 库
- 引入requests 库
- 用r.status_code 来分析响应状态码是否为200
- 用r.text 来分析响应内容
- 用r.encoding 来分析响应编码方式
- 用r.apparen_encoding 对响应内容编码方式分析
- 用r.content 响应内容的二进制形式
- 注意: 一般是使用r.encoding=r.apparen_encoding来解决爬取网页乱码的问题
下面展示一些python
import requests
def getHtml(url):
try:
r=requests.get(url)
r.raise_for_status()#用来测试响应返回状态码是否为200
r.encoding=r.apparent_encoding #用来解决页面乱码
return r.text
except:
return '发生异常'
if __name__=='__main__'
u="http://www.baidu.com"
print(getHtml(u))
###HTTP协议对资源的操作方法(请求方式)
- get查: 请求URL位置资源
- head查: 请求获取URL位置资源响应消息报告
- post增: 请求URL位置的资源后附加新的数据(一般用于提交表单)
- put增: 请求URL位置存储一个资源,覆盖URL位置资源
- patch改: 请求局部更新URL位置的资源,即改变该处资源的部分内容
- delete删: 请求删除URL 位置存储的资源
####patch和put 的区别 - put是全部重新定向(具有覆盖性)
- patch 则是将单一数据修改
###requests库13个控制访问参数(**kwargs)-
params:字典或者字节序列,增加到URL🔗中
import requests d={'key1':'value1','key2':'value2'} r=requests.get('http://python123.io/ws',params=d) print(r.url) https://python123.io/ws?key1=value1&key2=value2
-
data: 字典或者字节序列,增加的请求体中🌍
import requests d={'key1':'value1','key2':'value2'} r=requests.request('POST','http://python123.io.ws',data=d)#方法一 r=requests.post('http://python123.io/ws',data=d)#方法二 print(r.url)
-
json: json格式的数据
import requests d={'key1':'value1','key2':'value2'} r=requests.post('http://python123.io/ws',json=d) r=requests.request('POST','http://python123.io/ws',json=d) print(r.url)
-
headers:字典,HTTP协议头
import requests head={'user-agent':'Chrome/10'} r=requests.post('http://python123.io/ws',headers=head) print(r.url)
-
cookies:字典或者CookieJar,Request中的cookie
1. 查看cookie
2. requests 库的cookie是用字典的形式展示的,而网页中的cookie是用;进行分割的
3. -
auth:元组,支持HTTP认证功能
-
files:字典类型,传输文件(可以向某一个链接提交某一个文件)
import requests fs={'file':open('path','rb')} r=requests.post('http://python123.io/ws',file=fs)
-
timeout:设定超时时间
-
proxies:字典类型,设定访问代理服务器,可以增加登陆认证
-
allow_redirects:重定向开关 (boolean)
-
stream:获取内容立即下载开关(boolean)
-
verify:认证SSL证书开关(boolean)
-
cert:本地SSL证书路径
-
robots.txt 网络爬虫排除标准
Beautiful Soup 解析HTML页面
安装BeautifulSoup 库
pip install beautifulsoup4
查看库安装情况
pip list
简单实例
import requests #导入Requests 库
from bs4 import BeautifulSoup #导入beautiful soup 库
url='http://python123.io/ws/demo.html'
r=requests.get(url)
r.encoding=r.apparent_encoding
#获取的网页内容
page=r.text
#解析页面内容
soup=BeautifulSoup(page,'html.parser')
#美化页面
print(soup.prettify())
属性 | 说明 |
---|---|
.contents | 子节点列表 |
.children | 子节点的迭代类型 |
.descendants | 子孙节点的迭代 |
– | – |
.parent | 节点的父标签 |
.parents | 节点的祖先标签 |
– | – |
.name | 遍历标签下有哪些标签 |
Re 正则表达式库
用来简洁表达一组字符串的方式
操作符 | 说明 | 实例 |
---|---|---|
. | 表示任何单个字符 | |
[] | 字符集,对单个字符给出取值范围 | [abc]表示a,b,c`[a-z]表示a到z单个字符 |
[^] | 非字符集,排除单个字符 | [^abc]表示非a,b,c的单个字符 |
* | 前一个字符0次或无限次扩展 | abc*表示ab,abc,abcc,abccc, |
+ | 前一个字符1次或无限次扩展 | abc+表示abc,abcc,abccc |
| | 表示左右任意一个 | abc|def表示abc、def |
? | 前一个字符出现0次或1次扩展 | abc?表示ab,abc |
{m} | 前一个字符出现的次数 | ab{2}c表示abbc |
{m,n} | 前一个字符出现m到n次 | ab{2,3}c表示abbc或abbbc |
^ | 匹配字符串开头 | ^abc表示abc在一个字符串的开头 |
$ | 匹配字符串结尾 | abc$表示abc 结尾的字符串 |
() | 分组标记,内部只能使用“|”操作符号 | (abc)表示abc,(abc|def)表示abc、def |
\d | 数字,等价于[0-9] | |
\D | 匹配除数字以外字符 | |
\w | 除标点符号以外字符,等价于[A-Za-z0-9] |
re模块的七重境界
- 第一重(固定字符串查找)
import re
text='升高:188,体重:167,年龄29,学号:0927,电话:110'
# 假设查找一个固定字符串188
#text表示要查找的字符串
a=re.findall(r'188',text)
print(a)
- 第二重(找到数字类型字符)
import re
text='升高:188,体重:167,年龄29,学号:0927,电话:110'
# 假设查找所有单个数字字符 使用\d
a=re.findall(r'\d',text)
print(a)
- 第三重(查找多个数字类型或者出标点符号类字符)
import re
text='升高:188,体重:167,年龄29,学号:0927,电话:110'
# 假设查找所有单个数字字符 使用\d
# {3.5}代表查找该类型字符串的长度区间为3-5
a=re.findall(r'\d{3,5}',text)
#代表查找文本内连贯的字符串
b=re.findall(r'\d+',text)
print(a)
4.第四重(查找连贯字符串)
import re
text='升高:188,体重:167,年龄29,学号:0927,电话号码:110'
a=re.findall(r'\D+',text) #表示除了数字以外连贯字符串
b=re.findall(r'\d+',text) #表示查找连贯数字字符串
c=re.findall(r'\w+',text)#表示查找标点符号意外的连贯字符串
print(a)
print(b)
print(c)
- 第五重( 查找两种不同排列结构的连贯字符串)
from cgi import print_arguments
import re
text='手机号:18500009999,邮箱:1498999631@qq.com'
#"|"表示两种不同排列结构的连贯字符串
# - 1\d{10}表示手机号
# - \w+@qq.com表示qq邮箱
a=re.findall(r'1\d{10}|\w+@qq.com',text)
print(a)
- 第六重(限定位置, 如:文章开头或者结尾)
import re
text='手机号:18500009999,邮箱:1498999631@qq.com'
# "^"表示文章开头开始匹配正则表达式
# "$"表示文章末尾开始匹配正则表达式
a=re.findall(r'^1\d{10}|\w+@qq.com$',text)
print(a)
- 第七重(内部约束)
import re
text='手机号:18500009999,邮箱:1498999631@qq.com'
#匹配邮箱后字符
a=re.findall(r'(?<=邮箱.)\w+@qq.com',text)
print(a)