Requests库
get方法:
R = requests.get(url)
requests库内部生成一个Request对象向浏览器发出请求
返回的Response对象包含所有返回的内容
response对象的五个属性
(1)r.status_code 返回的状态
(2)r.text 响应内容的字符串形式 即页面代码 Unicode形式
(3)r.encoding HTTP header中猜测的响应内容的编码形式即charset字段,若不存在默认为ISO-8859-1
(4)r.apparent_encoding 从内容中分析出的响应内容编码方式 (更准确)
(5)r.content 返回的二进制形式数据
r.raise_for_status()#如果状态不是200,引发HTTPError异常
def getHTMLText(url):
try:
r = requests.get(url,timeout=30)
r.raise_for_status()#如果状态不是200,引发HTTPError异常
r.encoding = R.apparent_encoding %很耗时间,尽量自己赋值
Except:
return ‘产生异常’
Head()方法可以用很少的流量获得header信息
Post()方法可以提交字典
**kwargs:控制访问的参数,均为可选项
params={‘k1’:’v1’}相当于加在url后面的参数
data={‘k1’,’v1’} data='内容'作为Request的内容
json=kv JSON格式数据作为Request的内容
headers={'user-agent':'Chrome/10'} HTTP定制头 模拟浏览器发起访问
timeout = 10 返回TimeOut异常
get方法:
R = requests.get(url)
requests库内部生成一个Request对象向浏览器发出请求
返回的Response对象包含所有返回的内容
response对象的五个属性
(1)r.status_code 返回的状态
(2)r.text 响应内容的字符串形式 即页面代码 Unicode形式
(3)r.encoding HTTP header中猜测的响应内容的编码形式即charset字段,若不存在默认为ISO-8859-1
(4)r.apparent_encoding 从内容中分析出的响应内容编码方式 (更准确)
(5)r.content 返回的二进制形式数据
r.raise_for_status()#如果状态不是200,引发HTTPError异常
def getHTMLText(url):
try:
r = requests.get(url,timeout=30)
r.raise_for_status()#如果状态不是200,引发HTTPError异常
r.encoding = R.apparent_encoding %很耗时间,尽量自己赋值
Except:
return ‘产生异常’
Head()方法可以用很少的流量获得header信息
Post()方法可以提交字典
**kwargs:控制访问的参数,均为可选项
params={‘k1’:’v1’}相当于加在url后面的参数
data={‘k1’,’v1’} data='内容'作为Request的内容
json=kv JSON格式数据作为Request的内容
headers={'user-agent':'Chrome/10'} HTTP定制头 模拟浏览器发起访问
timeout = 10 返回TimeOut异常
网络爬虫引发的问题
骚扰问题
法律风险
隐私泄露
robots协议
发布公告:告诉那些页面可以爬取,哪些不行
和人类行为相似可以不参考robots协议
很多人机交互都是通过链接向服务器进行请求,可以用python来模拟
BeautifulSoup:
from bs4 import BeautifulSoup 导入bs这个类
BeautifulSoup 将(html文档)标签树转换为 BeautifulSoup类
基本元素:
1.tag
2.Name
3.Attributes
4.NavigableString .String
5.Comment
.name(a标签的name就是a) .某标签(.a获得a标签) .parent .attrs(属性,用字典组织) .string(非属性的字符串即a标签的内容,可以跨越多个标签获得内容|如果是注释<!-- -->会被去掉得到注释类型)
标签树的下行遍历
.contents 列表类型 所有儿子节点放入列表
.children 迭代类型 只能用在for in语句中 儿子节点(下一层 ***包含字符串***)
.descendants 迭代类型 只能用在for in语句中 子孙节点即获得后序所有节点(下面所有层)
上行遍历
.parent 节点父亲
.parents 迭代类型
平行遍历
.next_sibling 下一个平行节点 (包括字符串)
.previous_sibling 上一个平行节点
.next_siblings 迭代类型 后续所有平行节点(需要注意navigabalString也构成了节点 即内容也是sibling)
.previous_siblings 迭代类型 前续所有平行节点
soup.a.prettyfy()可以作用于标签
BeautifulSoup 信息检索
soup.find_all(['a','b']) find_all可以省略
soup.find_all(True)所有标签
soup.find_all(tag,attribute,recursive,string)
soup,find_all(id='link1')
recursive默认为True,改为False则只找下一层 soup.fin_all('a',recursive=False)==>[]从soup根节点下一层没有a标签
string:<>...</>中字符串区域的检索 经常结合正则表达式
find() 只返回一个结果字符串形式
find_parents() find_parent() .find_next_sibling() ...
chr(12288)使用中文空格填充 tmpl = "{0:^6}\t{1:{3}^10}\t{2:^10}".format(.,.,.,chr(12288))
正则表达式
re.match(pattern,string,flags=0)从头开始 返回match对象
re.search(pattern,string,flags=0)查找第一个匹配的位置 返回match对象
re.find_all(pattern,string,flags=0)以列表形式返回查找的子串
re.split(pattern,maxsplit = 0,string,flags=0) 将一个字符串按照正则表达式匹配的字符进行分割 maxsplit将剩下字符串作为整体直接输出
re.finditer(pattern,string,flags=0)返回一个匹配结果的迭代类型,每个迭代元素都是一个match对象
re.sub(pattern,repl,string,count=0,flags=0) 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串 count是最大替换次数
regx,match(string,flags=0)
flags:
re.I 忽略大小写
re.M ^可以匹配每行的开始部分
re.S .号可以匹配所有字符(默认无法匹配换行符)
先将正则表达式表示编译成正则表达式 多次运行会提高运行效率
match对象
1. .string 待匹配的字符串
2. .re 正则表达式
3. .pos 开始匹配的位置
4. .endpos 结束匹配的位置
5. .start() 匹配到的开始位置
6. .end() 匹配到的结束位置
7. .span() 5,6的二元关系
Re默认贪婪匹配 *? +?加上?变成最小匹配
好的程序在于用户体验,加入动态滚动条显示进度就很好