网络爬虫(又被称为网页蜘蛛,网络机器人,在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

使用介绍:

 import requests #导入库

 #get请求数据
res=requests.get("http://www.baudu.com")#get请求URL
# res=requests.get("http://www.baidu.com",params={"w1":"ww11","w2":"ww22"})#get带参数请求
print(res.url)#获取到访问的URL #post请求数据
res=requests.post("http://www.baudu.com")#post请求URL
# res=requests.post("http://www.baidu.com",data={"w1":"ww11","w2":"ww22"})#post带参数请求 #post上传文件
#filex={"img":open('dongdd/web.py','rb')}#文件表单
#filex={"img":("evil.jpg",open('dongdd/1.jpg','rb'))}#指定文件名更改为evil.jpg
filex={"img":("veil.txt","人的一切痛苦,\r\n本质上是对自己无能的愤怒!\r\n wowo")}#以文件保存字符串
res=requests.post(urlx,files=filex) #cookies
#cookie在请求页第一次设置后是不能马上用下列函数拿到值的,必须是请求前存在 print(res.cookies)#打印所有cookie
print(res.cookies["us"])#获取单个cookie #携带自定义cookie,可做当次页面cookie比较验证
coo={"cc1":"ccc01","cc2":"ccco2"}
res=ss.post("http://192.168.43.21:8080/login.php",cookies=coo) #自动携带网站上的cookie,访问页面,上面代码设置cookie的不可被自动携带,必须每次手动
ss=requests.Session()
res=ss.post("http://192.168.43.21:8080/login.php")
res=ss.post("http://192.168.43.21:8080/cancel.php")#可做页面1中cookie验证 #超时
#默认为一直请求URL,处于停止状态,所以必须要设置超时
res=requests.post("http://192.168.43.121:8080/login.php",timeout=0.2)#连接时间为:0.2s
#设置连接超时和读超时:timeout=(3.05, 27) #第一个为规定连接时间,第二个为规定读取时间
#永远等待相应:timeout=None #修改或添加请求头,请求头的必要参数可修改
headx={'User-Agent': 'wwwwwwwww', 'Connection': 'xxxxxxx', 'tt': '--------'}
res=requests.get("http://193.112.87.66/wx/file.php",headers=headx)
print(res.request.headers)#获取请求头 #其他相关参数
print(res.status_code)#获取访问状态码,200(系统常量:requests.codes.ok)为成功
print(res.raise_for_status())#请求错误时可以打印错误(4XX客户端错误或5XX服务器错误响应)
print(res.encoding)#查看编码
res.encoding="utf-8"#更改编码 另外值:ISO-8859-1
print(res.headers)#以字典形式打印相应头,HTTP标头名称不区分大小写
print(res.headers["date"])#print(res.headers.get("DAte"))打印出相应头时间信息
print(res.text)#打印网页源码 #json数据解析:
jsontt1=res.json()#得到json数据
print(jsontt1.keys())#输出所有json可键名
print(jsontt1["key11"])#获取单个键的数据 #二进制格式数据:res.content
#获取一张网络图片并存储实现:
res=requests.get("http://193.112.87.88/wx/img/0.jpg",timeout=5)#访问得到图片数据
f=open("ww.jpg","wb")#以二进制方式打开文件
f.write(res.content)#写入二进制数据
f.close()#必须关闭文件 #从服务器获取原始套接字响应,您可以访问res.raw,必须设置:stream=True
#数据只能使用一次(类似文件指针)
res=requests.get("http://193.112.87.88/wx/file.php",stream=True)
res.raw.read(10)#读十个字节 #另一种方式获取网页源代码:
res=requests.get("http://193.112.87.88/wx/file.php",stream=True)
rxx=res.raw.read(1)#读取一个字节
f=open("www.txt","wb")
while rxx:#判断是否为空
print(rxx)
f.write(rxx)#写一个字节
rxx = res.raw.read(1)#读下一个字节
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模块

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

BeautifulSoup库基本使用

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


爬虫不过如此(python的Re 、Requests、BeautifulSoup 详细篇)的更多相关文章

  1. python 爬虫(一) requests+BeautifulSoup 爬取简单网页代码示例

    以前搞偷偷摸摸的事,不对,是搞爬虫都是用urllib,不过真的是很麻烦,下面就使用requests + BeautifulSoup 爬爬简单的网页. 详细介绍都在代码中注释了,大家可以参阅. # -* ...

  2. 【Python】在Pycharm中安装爬虫库requests , BeautifulSoup , lxml 的解决方法

    BeautifulSoup在学习Python过程中可能需要用到一些爬虫库 例如:requests BeautifulSoup和lxml库 前面的两个库,用Pychram都可以通过 File--> ...

  3. 【网络爬虫入门01】应用Requests和BeautifulSoup联手打造的第一条网络爬虫

    [网络爬虫入门01]应用Requests和BeautifulSoup联手打造的第一条网络爬虫 广东职业技术学院 欧浩源 2017-10-14  1.引言 在数据量爆发式增长的大数据时代,网络与用户的沟 ...

  4. Python爬虫实例(五) requests+flask构建自己的电影库

    目标任务:使用requests抓取电影网站信息和下载链接保存到数据库中,然后使用flask做数据展示. 爬取的网站在这里 最终效果如下: 主页: 可以进行搜索:输入水形物语 点击标题进入详情页: 爬虫 ...

  5. 使用python抓取并分析数据—链家网(requests+BeautifulSoup)(转)

    本篇文章是使用python抓取数据的第一篇,使用requests+BeautifulSoup的方法对页面进行抓取和数据提取.通过使用requests库对链家网二手房列表页进行抓取,通过Beautifu ...

  6. 小白学 Python 爬虫(18):Requests 进阶操作

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  7. Python Download Image (python + requests + BeautifulSoup)

    环境准备 1 python + requests + BeautifulSoup 页面准备 主页面: http://www.netbian.com/dongman/ 图片伪地址: http://www ...

  8. python爬虫:爬虫的简单介绍及requests模块的简单使用

    python爬虫:爬虫的简单介绍及requests模块的简单使用 一点点的建议: (学习爬虫前建议先去了解一下前端的知识,不要求很熟悉,差不多入门即可学习爬虫,如果有不了解的,我也会补充个一些小知识. ...

  9. 爬虫-python调用百度API/requests

    from urllib.request import urlopen import requests import json url = "http://apis.baidu.com/txa ...

随机推荐

  1. jqgrid content-type datatype

    jQuery('#jq2').jqGrid( { url: 'http://localhost:8080/api/RskPriceFactorTest/senario/0/detail', editu ...

  2. mysql编译好的简单安装

    .创建mysql用户的账号 useradd mysql .下载mysql编译好的压缩包 .安装mysql yum -y install numactl libaio 安装依赖库 tar -zxvf m ...

  3. OO第二单元单元总结

    总述 OO的第二单元主题是电梯调度,与第一单元注重对数据的输入输出的处理.性能的优化不同,第二单元的重心更多的是在线程安全与线程通信上.这此次单元实验之前,我并未对线程有过了解,更谈不上“使用经验”, ...

  4. vue中 关于$emit的用法

    1.父组件可以使用 props 把数据传给子组件.2.子组件可以使用 $emit 触发父组件的自定义事件. vm.$emit( event, arg ) //触发当前实例上的事件 vm.$on( ev ...

  5. Jmeter+ant集成接口测试报告

    一.jdk1.8下载及环境配置 1.1 下载地址 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-download ...

  6. appium解决每次运行都需要安装Unlock以及AppiumSetting的问题

    这是我用appium遇到的第三个坑?之前因为环境的问题,chromedriver驱动总是安装不对,后来发现是因为路径的原因.解决之后,现在出现新的问题,那就是“appium每次运行都要去重新安装Unl ...

  7. JS模块化工具require.js教程(一):初识require.js

    随着网站功能逐渐丰富,网页中的js也变得越来越复杂和臃肿,原有通过script标签来导入一个个的js文件这种方式已经不能满足现在互联网开发模式,我们需要团队协作.模块复用.单元测试等等一系列复杂的需求 ...

  8. Exp2 后门原理与实践 20154320 李超

    目录- 基础问题回答- 基础知识- 实验过程- 实验心得体会 基础知识问答 1. 例举你能想到的一个后门进入到你系统中的可能方式?从不安全的网站上下载的程序可能存在后门. 2. 例举你知道的后门如何启 ...

  9. nginx的锁

    一.原理 nginx的锁是基于共享内存实现的,这点跟redis中利用一个存储(也就是一个键值对)来实现锁的原理是一致的,每一项操作通过检查锁对象的lock域是否为0,来判断能否获取锁并尝试获取锁. 二 ...

  10. Jmeter学习过程中遇到的那些坑

    开个新帖,持续记录学习jmeter过程中遇到的坑... (1)出师不利 由于公司的产品都是客户端模式,所以所有的接口测试都从获取access-token开始.妹的...上来就是一个坑... 一开始的配 ...