python爬虫基础

本文将介绍Python爬虫的基础知识,包括requests库的使用、BeautifulSoup解析网页、数据存储及常见的反爬策略应对方法,帮助初学者快速入门网络爬虫技术。

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异常

网络爬虫引发的问题
 骚扰问题
 法律风险
 隐私泄露

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默认贪婪匹配 *? +?加上?变成最小匹配
好的程序在于用户体验,加入动态滚动条显示进度就很好
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值