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


    网络爬虫(又被称为网页蜘蛛,网络机器人,在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("http://www.baudu.com")#post请求URL
    13 # 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.jpg
    18 filex={"img":("veil.txt","人的一切痛苦,
    本质上是对自己无能的愤怒!
     wowo")}#以文件保存字符串
    19 res=requests.post(urlx,files=filex)
    20 
    21 
    22 
    23 #cookies
    24 #cookie在请求页第一次设置后是不能马上用下列函数拿到值的,必须是请求前存在
    25 
    26 print(res.cookies)#打印所有cookie
    27 print(res.cookies["us"])#获取单个cookie
    28 
    29 #携带自定义cookie,可做当次页面cookie比较验证
    30 coo={"cc1":"ccc01","cc2":"ccco2"}
    31 res=ss.post("http://192.168.43.21:8080/login.php",cookies=coo)
    32 
    33 #自动携带网站上的cookie,访问页面,上面代码设置cookie的不可被自动携带,必须每次手动
    34 ss=requests.Session()
    35 res=ss.post("http://192.168.43.21:8080/login.php")
    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",timeout=0.2)#连接时间为:0.2s
    43 #设置连接超时和读超时:timeout=(3.05, 27) #第一个为规定连接时间,第二个为规定读取时间
    44 #永远等待相应:timeout=None
    45 
    46 
    47 #修改或添加请求头,请求头的必要参数可修改
    48 headx={'User-Agent': 'wwwwwwwww', 'Connection': 'xxxxxxx', 'tt': '--------'} 
    49 res=requests.get("http://193.112.87.66/wx/file.php",headers=headx) 
    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-1
    57 print(res.headers)#以字典形式打印相应头,HTTP标头名称不区分大小写
    58 print(res.headers["date"])#print(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.content
    67 #获取一张网络图片并存储实现:
    68 res=requests.get("http://193.112.87.88/wx/img/0.jpg",timeout=5)#访问得到图片数据
    69 f=open("ww.jpg","wb")#以二进制方式打开文件
    70 f.write(res.content)#写入二进制数据
    71 f.close()#必须关闭文件
    72 
    73 #从服务器获取原始套接字响应,您可以访问res.raw,必须设置:stream=True
    74 #数据只能使用一次(类似文件指针)
    75 res=requests.get("http://193.112.87.88/wx/file.php",stream=True)
    76 res.raw.read(10)#读十个字节
    77 
    78 #另一种方式获取网页源代码:
    79 res=requests.get("http://193.112.87.88/wx/file.php",stream=True)
    80 rxx=res.raw.read(1)#读取一个字节
    81 f=open("www.txt","wb")
    82 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键、换行),相当于[ fv]

    【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和】开始和结束,用法跟上相同 ,但不是以行为结束

    【】单词边界(空格),r’are’,匹配字符串“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')]

     使用介绍:

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

     

    BeautifulSoup库基本使用

    安装:
       sudo pip3 install beautifulsoup4
    使用介绍:
     1 from bs4 import BeautifulSoup#导入模块
     2 import requests #网页访问库
     3 res=requests.get("http://193.112.87.88/wx/file.php")
     4 res.encoding="utf-8"
     5 
     6 be=BeautifulSoup(res.text,"lxml")#得到BeautifulSoup对象,lxml为HTML解析器,如XML解析则要用xml
     7 print(be.original_encoding)#输出编码
     8 print(be.prettify())#以标准HTML格式输出网页源码
     9 
    10 print(be.input)#获取到第一个input标签全部内容:<input name="img" type="file"/>
    11 print(be.form.input)#获取到标签(form)下的子标签(input)
    12 print(be.form.encode("latin-1"))#自定义编码输出
    13 print(be.input.parent.parent)#获取input标签的父节点的父节点
    14 print(be.input.previous_sibling)#上一个兄弟节点
    15 print(be.input.next_sibling)#下一个兄弟节点
    16 print(be.img)#获取到第一个img标签内容:<img src="img/0.jpg"/>
    17 picture=be.img
    18 print(picture.get('src'))#获取该属性值(优先考虑):img/0.jpg
    19 print(be.img["src"])#直接获取属性值
    20 
    21 #获取到标签内容值
    22 print(be.title) # <title>东小东页</title>
    23 print(be.title.text) #东小东页
    24 print(be.title.string) #东小东页
    25 
    26 #函数find_all()和find()使用,参数使用是相同的
    27 #参数值均可使用:字符串、列表、正则对象、True(任意值)
    28 
    29 print(be.find_all(class_="yzm",limit=2))#limit为要返回的条数
    30 print(be.find_all('input')) #查询所有标签名为input,存入到列表
    31 be.find_all(id='link2')#通过id值查找
    32 print(be.find_all(type=True))#type为true表示可以接收任意值
    33 print(be.find_all(class_="yzm"))#通过class属性查找内容,注意class后面有下划线
    34 print(be.find_all(src=re.compile(r"img/.*?jpg")))#通过src属性查找
    35 print(be.find_all('img')[0]["src"])# img/0.jpg
    36 #--------------------------------------------------
    37 import re #使用正则表达式
    38 for inx in be.find_all(re.compile(r"i")):#匹配带i字母的所有标签名
    39     print(inx.name)
    40 #------------------------------------------------
    41 for inx in be.find_all(["input","img"]):#列表传递多个需匹配标签名
    42    print(inx)
    43    print(inx.get("name"))#获取标签name属性值
    44 #------------------------------------------------------
    45 
    46 #找到第一个,且只找一个
    47 print(be.find(type="file"))#通过属性查找
    48 print(be.find("input"))#通过标签查找
    49 print(be.find("input",type="password"))#通过标签加属性查找,可支持有:id、type等
    50 print(be.find(text="东小东").parent)#通过text属性查找:<legend>东小东</legend>
    51 #参数不支持name和data-*
    52 print(be.find_all(attrs={"name":"yzm"}))#可用此方法解决
    53 
    54 
    55 #扩展:
    56 be=BeautifulSoup(open("www.txt","rb"))#直接读取文件内容



  • 相关阅读:
    [cf621E]Wet Shark and Blocks
    [学习笔记]数论
    [CZYZ2016]day8
    Python 对 Excel 操作用法详解
    HTML学记笔记
    Django 2.2_错误:UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: illegal multibyte sequence
    Python在终端通过pip安装好包以后,在Pycharm中依然无法使用的解决办法
    div的移动特效
    jQuery各种动画效果
    jqZoom插件
  • 原文地址:https://www.cnblogs.com/dongxiaodong/p/10042766.html
Copyright © 2020-2023  润新知