美文网首页python热爱者Python新世界
如果你已经学完python基础,那就利用它来入门爬虫!

如果你已经学完python基础,那就利用它来入门爬虫!

作者: 48e0a32026ae | 来源:发表于2018-11-30 15:05 被阅读2次

    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。 学习Python中有不明白推荐加入交流群

                    号:516107834

                    群里有志同道合的小伙伴,互帮互助,

                    群里有不错的学习教程!

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

    爬虫的实现可认为是模拟浏览 器与服务器数 据交互,伪造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.get("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键、换行),相当于[ �]

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

    【】单词边界(空格),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); #输出对象:,未匹配到则返回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); #输出对象:,未匹配到则返回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

    sudo pip3 install lxml

    使用介绍:

    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.find_all("form"))#输出编码

    8 print(be.prettify())#以标准HTML格式输出网页源码

    9

    10 print(be.input)#获取到第一个input标签全部内容:

    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)#下一个兄弟节点

    17 picture=be.img

    18 print(picture.get('src'))#获取该属性值(优先考虑):img/0.jpg

    19 print(be.img["src"])#直接获取属性值

    20

    21 #获取到标签内容值

    22 print(be.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属性查找:东小东

    51 #参数不支持name和data-*

    52 print(be.find_all(attrs={"name":"yzm"}))#可用此方法解决

    53

    54

    55 #扩展:

    56 be=BeautifulSoup(open("www.txt","rb"))#直接读取文件内容

    相关文章

      网友评论

        本文标题:如果你已经学完python基础,那就利用它来入门爬虫!

        本文链接:https://www.haomeiwen.com/subject/nyjhcqtx.html