爬虫不过如此(python的Re 、Requests、BeautifulSoup 详细篇)

爬虫不过如此(python的Re 、Requests、BeautifulSoup 详细篇),第1张

概述网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。 爬虫的本质就是一段自动抓取互联网信息的程序,从网络获取

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。

爬虫的本质就是一段自动抓取互联网信息的程序,从网络获取感兴趣的信息,抓取对于我们有价值的信息,爬虫技术是大数据和云计算的基础。

爬虫的实现可认为是模拟浏览器与服务器数据交互,伪造http请求。

 

使用总览

网页爬取库:

1、urllib模块的urllib.request       

#基本被取代

 

2、requests 第三方库               

#中小型爬虫开发

#官网:http://www.python-requests.org/en/master/

 

3、Scrapy 框架                         

#大型爬虫开发

 

内容解析库:

1、BeautifulSoup库

#提取HTML和XML里的数据   

#官网https://www.crummy.com/software/BeautifulSoup/bs4/doc/

 

2、re模块

#正则表达式,处理字符串

 

查看网站爬虫协议

url/robots.txt

 

requests库基本使用

安装: 

sudo pip3 install requests

使用介绍:

 1 import requests #导入库 2  3  4 get请求数据 5 res=requests.get("http://www.baudu.com")get请求URL 6  res=requests.get("http://www.baIDu.com",params={"w1":"ww11","w2":"ww22"})#get带参数请求 7 print(res.url)获取到访问的URL 8  9 10 11 post请求数据12 res=requests.post(post请求URL13  res=requests.post("http://www.baIDu.com",data={"w1":"ww11","w2":"ww22"})#post带参数请求14 15 post上传文件16 filex={"img":open('dongdd/web.py','rb')}#文件表单17 filex={"img":("evil.jpg",open('dongdd/1.jpg','rb'))}#指定文件名更改为evil.jpg18 filex={img":(veil.txt",人的一切痛苦,\r\n本质上是对自己无能的愤怒!\r\n wowo")}以文件保存字符串19 res=requests.post(urlx,files=filex)20 21 22 23 cookies24 cookie在请求页第一次设置后是不能马上用下列函数拿到值的,必须是请求前存在25 26 print(res.cookies)打印所有cookie27 print(res.cookies[us"])获取单个cookie28 29 携带自定义cookie,可做当次页面cookie比较验证30 coo={cc1":ccc01cc2ccco2"}31 res=ss.post(http://192.168.43.21:8080/login.PHPcoo)32 33 自动携带网站上的cookie,访问页面,上面代码设置cookie的不可被自动携带,必须每次手动34 ss=requests.Session()35 res=ss.post()36 res=ss.post(http://192.168.43.21:8080/cancel.PHP可做页面1中cookie验证37 38 39 40 超时41 默认为一直请求URL,处于停止状态,所以必须要设置超时42 res=requests.post(http://192.168.43.121:8080/login.PHP连接时间为:0.2s43 设置连接超时和读超时:timeout=(3.05,27) #第一个为规定连接时间,第二个为规定读取时间44 永远等待相应:timeout=None45 46 47 修改或添加请求头,请求头的必要参数可修改48 headx={'User-Agent': wwwwwwwww',1)">Connectionxxxxxxxtt--------'} 49 res=requests.get(http://193.112.87.66/wx/file.PHPheadx) 50 print(res.request.headers)获取请求头51 52 其他相关参数53 print(res.status_code)获取访问状态码,200(系统常量:requests.codes.ok)为成功54 print(res.raise_for_status())请求错误时可以打印错误(4XX客户端错误或5XX服务器错误响应)55 print(res.enCoding)查看编码56 res.enCoding=utf-8更改编码 另外值:ISO-8859-157 print(res.headers)以字典形式打印相应头,http标头名称不区分大小写58 print(res.headers[dateprint(res.headers.get("DAte"))打印出相应头时间信息59 print(res.text)打印网页源码60 61 Json数据解析:62 Jsontt1=res.Json()得到Json数据63 print(Jsontt1.keys())输出所有Json可键名64 print(Jsontt1[key11获取单个键的数据65 66 二进制格式数据:res.content67 获取一张网络图片并存储实现:68 res=requests.get(http://193.112.87.88/wx/img/0.jpg访问得到图片数据69 f=open(ww.jpgwb以二进制方式打开文件70 f.write(res.content)写入二进制数据71 f.close()必须关闭文件72 73 从服务器获取原始套接字响应,您可以访问res.raw,必须设置:stream=True74 数据只能使用一次(类似文件指针)75 res=requests.get(http://193.112.87.88/wx/file.PHPTrue)76 res.raw.read(10)读十个字节77 78 另一种方式获取网页源代码:79 res=requests.get(80 rxx=res.raw.read(1)读取一个字节81 f=open(www.txt82 while rxx:判断是否为空83     print(rxx)84     f.write(rxx)写一个字节85     rxx = res.raw.read(1)读下一个字节86 f.close();必须关闭文件

 

re库(正则表达式)基本使用

安装:

python3环境自带

 基本介绍:

1、正则表达式是独立的语言,正则语言是共通的,比如之前写的PHP正则里有很多共同性

2、匹配单元介绍

转义字符:如点代表所有字符,所以可用\.表示字符串的点

【.】、【\】、【?】、【^】、【$】、【*】、【+】、【}】、【{】、【[】、【]】、【|】、【(】、【)】 

特殊符号字符:

【\d】所有数字,相当于[0-9]

【\D】所有非数字,相当于[^0-9]

【\w】任意一个字(a-z、A-Z、0-9、下划线、中文字)

【\W】任意非字,相当于[^a-zA-Z0-9_中文字]

【.】(点)任意一个原子

【\s】所有空白(空格、tab键、换行),相当于[\r\t\n\f\v]

【\S】任意非空白

匹配任意一个: 

    [字符1字符2字符3]//也可为[a-zA-Z]区间//匹配任意一个

     注意:

【^】为取反,写在中括号内开头处,表示除了括号里的所有字符都可以

【^】表示普通字符,写在括号里除最前面的任意位置 

  括号里的字符需要转义,虽然有些不用转义 

3、 匹配单元的修饰补充

【*】修饰前面的单个原子可以出现任意次

【+】修饰前面的单个原子至少要出现1次

【?】修饰前面的单个原子只能出现0次或者1次

【{ n }】修饰前面的单个原子只能出现n次

【{a,b}】修饰前面的单个原子只能出现  [ a,b ]  次 //至少两次用{2,  }

【|】修饰两边字符串任意谁整体出现,/intelligent|diligent/

【^字符1】必须以字符1开始的行,r’^xceee’必须以xceee为开始,写在表达式最前面

【$字符2】必须以字符2结尾的行,/\Aaa.*wo$/必须以aa开始和wo为结束,.*表示任意

【\A和\Z】开始和结束,用法跟上相同 ,但不是以行为结束

【\b】单词边界(空格),r’\bare\b’,匹配字符串“ware are xxx”匹配到are单词,

【\B】单词边界以外的部分

【( )】改变优先级,r’t(r|x)ol’,可匹配trol或者txol

以小变大:r’tel*’表示l可出现任意次=>r’t(el)*’表示el可出现任意次

用于取出:r’t(el)(.*)’如"xxwtelelllll"输出:[('el','elllll')]

 使用介绍:

import re 导入re模块 3 整体匹配 4 str=rTo live is to live' 原字符串,r表示原始字符,如‘\n’并不会被解释为换行 5 zstr=re.findall(li查找所有,返回列表print(zstr); 打印列表 输出:['li','li'] 7  8 用[ ]匹配其中一个 9 str=rlive and love' 10 zstr=re.findall(l[io]ve,str); 输出:['live','love']12 13 15 方法:compile(),生成re对象17 str=raawobbxxaatabbb原字符串18 re_job=re.compile(a        a.*?b b创建re对象19 zstr=re_job.findall(str); 使用re对象去查找20 打印列表,输出:['aawobb','aatabb']22 第二个参数值:【re.I】不区分大小写,r’teL’可匹配tel、Tel、TEL 等【re.M】换行后不示为同行,默认将\n换行示为以上一行为同一行,影响【^】【$】/^aa/使用有区别25 【re.S】修正表达式中【.】可匹配回车\n,如/a.*art/s匹配"I am \nsmart"【re.X】忽略正则表达式内容里所写的空白间隔,去掉空字符和# 后面的注释【re.U】根据Unicode字符集解析字符。这个标志影响 \w,\W,\b,\B方法:match(),正则字符串匹配开头30 str=rxxwtelelllll31 zstr=re.match(xx32 输出对象:<re.Match object; span=(0,2),match='xx'>,未匹配到则返回Noneif(zstr):34     print(匹配成功35 else:36     匹配失败38 方法:search(),正则字符串匹配任意一个位置39 str=rwtxxelelxxllll40 zstr=re.search(输出对象:<re.Match object; span=(2,4),1)">42 43     45 方法:sub(),正则法替换字符串内容48 str=r--x2x--xvx--49 zstr=re.sub(x.*?xPythonprint(zstr);输出:--Python--Python—51 将re.sub换成:re.subn()则输出次数:('--Python--Python--',2)52 方法:split(),正则法拆分字符串内容54 str=r1+2-6/1|2^555 zstr=re.split(r[\^\+\*\|\/\-]56 输出:['1','2','6','1','5']

 

BeautifulSoup库基本使用
安装:
   sudo pip3 install beautifulsoup4
使用介绍:
from bs4 import BeautifulSoup导入模块 2 网页访问库 3 res=requests.get( 4 res.enCoding=" 5  6 be=BeautifulSoup(res.text,1)">lxml得到BeautifulSoup对象,lxml为HTML解析器,如XML解析则要用xmlprint(be.original_enCoding)输出编码print(be.prettify())以标准HTML格式输出网页源码10 print(be.input)获取到第一个input标签全部内容:<input name="img" type="file"/>print(be.form.input)获取到标签(form)下的子标签(input)12 print(be.form.encode(latin-1"))自定义编码输出print(be.input.parent.parent)获取input标签的父节点的父节点14 print(be.input.prevIoUs_sibling)上一个兄弟节点print(be.input.next_sibling)下一个兄弟节点print(be.img)获取到第一个img标签内容:<img src="img/0.jpg"/>17 picture=be.img18 print(picture.get(src'))获取该属性值(优先考虑):img/0.jpg19 print(be.img[直接获取属性值21 获取到标签内容值print(be.Title)  <Title>东小东页</Title>print(be.Title.text) 东小东页print(be.Title.string) 函数find_all()和find()使用,参数使用是相同的参数值均可使用:字符串、列表、正则对象、True(任意值)print(be.find_all(class_=yzmlimit为要返回的条数30 print(be.find_all(input')) 查询所有标签名为input,存入到列表31 be.find_all(ID=link2')通过ID值查找print(be.find_all(type=True))type为true表示可以接收任意值通过class属性查找内容,注意class后面有下划线34 print(be.find_all(src=re.compile(rimg/.*?jpg")))通过src属性查找')[0][ img/0.jpg36 --------------------------------------------------37 使用正则表达式for inx in be.find_all(re.compile(ri")):匹配带i字母的所有标签名39     (inx.name)------------------------------------------------in be.find_all(["]):列表传递多个需匹配标签名42    (inx)43    print(inx.get(name获取标签name属性值------------------------------------------------------46 找到第一个,且只找一个print(be.find(type=file通过属性查找48 print(be.find(通过标签查找49 password通过标签加属性查找,可支持有:ID、type等print(be.find(text=东小东").parent)通过text属性查找:<legend>东小东</legend>参数不支持name和data-*print(be.find_all(attrs={"}))可用此方法解决53 54 扩展:56 be=BeautifulSoup(open(rb直接读取文件内容


 

总结

以上是内存溢出为你收集整理的爬虫不过如此(python的Re 、Requests、BeautifulSoup 详细篇)全部内容,希望文章能够帮你解决爬虫不过如此(python的Re 、Requests、BeautifulSoup 详细篇)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1189823.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存