总结:requests、beautifulsoup基础语法【崔庆

作者: 夜希辰 | 来源:发表于2019-01-06 13:14 被阅读8次
总结:requests、beautifulsoup基础语法【崔庆才爬虫学习】

接触爬虫三天,了解PHP相关知识html css js,requests库及beautifulsoup库基础语法。本篇文章不是案例实战,主要总结学习路径和基本语法。

基础爬虫学习目标(主要针对数据分析的同学):
1、了解html,css,js知识
2、学习requests,beautifulsoup库基础语法
3、模仿案例

我从爬虫基本的库开始学习,通过jupyter notebook练习基本语法,但是这个过程是越学越迷茫,里面有很多专业名词自己不理解,比如频率最高的html,忍受了不住迷茫终于求助百度找各种html知识。(PS:这里不总结关于HTP的知识,可学习do you do 【HTML+CSS入门课】前5个视频,总共100分钟时长3小时就可以入门)

如果你看见这篇文章,是否去学习是你自己的事,我始终觉得有学习能力、有明确目标制定计划能力的同学很优秀。现在很多人为了考试被动学习、懵懵懂懂付费学习,可是……可是……工作后的我们在也回不到校园,老师告诉学习内容、学习重点、针对学习内容进行阶段考试,用分数反馈学习成果。

身边很多爱学习的人,每天保持两三个小时学习,让每天学习三个小时的自己压力满满。但在我学习过程中发现一件事,虽然始终在学习但针对学习内容缺少反馈,以必备知识为例把学习掌握的标准定为100分;虽然每天读学习2小时,但把你学习的内容拿来考试可能只有50分、70分。

这可能工作中的一个问题吧,对于自己学到的知识缺少反馈,以上感想是我个人观点,不过写下来感觉还是很不错,对自己的思维进行了一番整理,我羡慕崇拜会思考的人,也一直想增添思维类型的文章,十年就做一件事、写文章、写思维型专业型文章也是自己一辈子奋斗的事。

关于学习:迷茫和未知是可怕的也要有探索未知的精神。即使别人告诉你学习目标但自学的过程也要自己走一番。
下面对requests库、beautifulsoup库基础语法做个简单的总结,语法真的非常简单,但在看实战的时自己真的很懵,不过我知道懵的状态是暂时的,模仿一两个项目就能解决这个问题,学习就是模仿借鉴原创的过程。

好啦~~~~开始requests、beautifulsoup语法部分。

一、requests库

重点学习:基本请求(get/post)、添加headers、获取cookies、代理设置、超时设置

1、案例引入——requests库

import requests
response = requests.get('http://www.baidu.com/')
print(type(response))
print(response.status_code)  #状态码
print(type(response.text))   #response.text的属性
print(response.text)   #得到相应的内容。和urllib.read()类似
print(response.cookies)

2、基本get请求——requests库

response = requests.get('http://httpbin.org/get') 
print(response.text)

2-a、带参数的get请求——requests库

方法一:
response = requests.get('http://httpbin.org/get?name = germey & age = 22')
print(response.text)
方法二:
data = {'name':'germey','age':22}
response = requests.get('http://httpbin.org/get',params= data)
print(response.text)
请求头、IP地址、请求的链接打印出来

3、添加headers——requests库

在做爬虫的时候非常有必要,如果不加headers会被禁掉,或者服务器错误等问题,加headers实现了爬虫浏览器的伪装。
eg:如果直接请求知乎会爆一个500的状态码,知乎需要识别浏览信息。解决方法非常简单,只需要给get方法传一个headers。

response = requests.get('http://www.zhihu.com/explore')
print(response.text)
headers = {'user-Agent':"Mozilla/5.0(windows NT 10.0;win64;X64)AppleWebkit/537.36(KHTML,like Gecko)chrome/70.0.3538.102 Safari/537.36"}
print(response.text)

4、post请求——requests库

data = {'name':'germey','age':22}
response = requests.post('http://httpbin.org/post',data = data)
print(response.text)

post请求加上一个Headers请求
data = {'name':'germey','age':22}
headers  = {'user-Agent':"Mozilla/5.0(windows NT 10.0;win64;X64)AppleWebkit/537.36(KHTML,like Gecko)chrome/70.0.3538.102 Safari/537.36"}
response = requests.post('http://httpbin.org/post',headers = headers)
print(response.json())

5、获取cookies——requests库
我们直接用response.cookies就可以把网站的属性都打印出来,cookies其实是一个列表的形式,在这里我们用一个for循环把每一个cookies取出来。把cookies的key.values打印出来。可以看见打印出来的类型是requests.cookie.Jar类型。在把key.value打印出来就可以看见有两个cookie。

headers
import requests
response = requests.get('http://www.baidu.com')
print(response.cookies)
for key,value in response.cookies.ltems():
    print(key + '=' + value)
运行不出来。cookies是维持围炉状态的,会话的维持

5-a、模拟登陆《会话维持》——requests库

import requests
requests.get('http://httpbin.org/cookies/set/number/123456789')
response = requests.get('http://httpbin.org/cookies')
print(response.text)

我们为这个网站在访问的时候设置了一个cookies,然后我们在用requests.get访问这个cookies。它就可以把网站当前的cookies拿到。先set在cookies就可以看它是否能拿到当前的cookies.

会出现运行结果cookies是一个空的状态。原因是因为我们在这里发起了两次请求,而且都是用requests.get发起请求的。这两次请求实际上是两次完全独立的过程。

可以理解为用一个浏览器设置了一个cookies,用另外一个浏览器访问一个cookies页面.也就是说在两个页面分别操作的,是获取不到任何cookies信息,需要用Session解决

5-b、Session方法——requests库
在同一个浏览器时下set和get的方法,需要使用Session方法
模拟了在浏览器里面发起请求,相当于维持了一个登陆会话。

s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
response = s.get('http://httpbin.org/cookies')
print(response.text)

6、异常处理——requests库
异常会导致程序中断.写爬虫的时候异常处理模块非常有必要的,可以保证程序一直不间断的运行,首先捕捉子类的异常在捕捉父类的异常

from requests.exceptions import ReadTimeout,ConnectionError,RequestException
try:
    response = requests.get('http://httpbin.org/get',timeout = 0.4)
    print(response.status_code)
except ReadTimeout:
    print('Timeout')
except ConnectionError:
    print('Connection error')
except RequestException:
    print('Error')

6-a、超时设置——requests库

response = requests.get('http://www.taobao.com',timeout = 1)
print(response.status_code)

6-b、如何设置防止超时报错——requests库

from requests.exceptions import ReadTimeout
try:
    response = requests.get('http://httpbin.org/get',timeout = 0.4)
    print(response.status_code)
except ReadTimeout:
    print('Timeout')

补充:response属性——requests库

response = requests.get('http://www.jianshu.com')
print(type(response.status_code),response.status_code)
print(type(response.headers),response.headers)
print(type(response.cookies),response.cookies)  #代理池
print(type(response.url),response.url)
print(type(response.history),response.history)

小结:关于requests就总结这6个重点掌握模块。证书验证、requests解析json方法、获取二进制数据、保存图片、上传文件等内容可以看相关文档,或者学习崔庆才爬虫讲解.(点击文字可获取相应学习资料)

二、beautifulsoup库

学习重点:基本使用、标准选择器、CSS选择器(标签选择器、CSS选择器、find_all选择器、find选择器)

1、案例引入——beautifulsoup库

html = ……
from bs4 import BeautifulSoup
soup = Beautifulsoup(html,'lxml')  
print(soup.prettify())  
print(soup.title.string)  

解析:soup = Beautifulsoup(html,'lxml') ——声明Beautifulsoup对象,把html传入进来,在传入解析器lxml,接下来我们就调用beautifulsoup一些方法
print(soup.prettify()) ——格式化代码,可以自动的将代码进行补全,进行容错的处理
print(soup.title.string) ——选择title并且把它的内容打印出来string

2、标签选择器——beautifulsoup库、标签选择器

选择元素 、获取名称 、获取内容 、获取标签的内容 、嵌套选择 子节点和子孙节点 、父节点和祖节点 、获取兄弟节点

2-a、选择元素——beautifulsoup库、标签选择器

html = ……
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
print(soup.title)
print(type(soup.title))
print(soup.head)
print(soup.p)   #p标签,如果有多个它指返回一个结果。如果有多个p标签只会返回访问的第一个内容

2-b、获取名称(属性)——beautifulsoup库、标签选择器

html = ……
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
print(soup.title.name)   #获取了title的name属性,实际上是获取了最外层标签的名称

2-c、获取内容——beautifulsoup库、标签选择器

html = ……
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
print(soup.b.attrs['name'])  #name就是属性
print(soup.b['name'])  #获取p标签的name 也可以不用attrs。可以直接获取name属性

2-c_、获取标签的内容——beautifulsoup库、标签选择器

html = ……
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
print(soup.b.string)   #获取p标签里面的文字

2-d、嵌套选择——beautifulsoup库、标签选择器

html = ……
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
print(soup.head.title.string)

2-e、子节点和子孙节点——beautifulsoup库、标签选择器

获取子节点方法一:
html = ……
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
print(soup.p.contents)  #所有的节点用列表的试行返回回来

获取子节点方法二:
html = ……
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
print(soup.p.childern)
for l,child in enumerate(soup.p.childern):
    print(l,child)

.childern是一个迭代器,它不是一个实际列表的形式。需要yoga循环的方法才能把它的内容取得

获取所有子孙节点方法三、
html = ……
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
print(soup.p.descendants)
for l,child in enumerate(soup.p.descendants):
    print(l,child)

2-f、父节点和祖节点——beautifulsoup库、标签选择器

获取父节点
html = ……
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
   
获取所有的祖先节点
html = ……
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
print(soup.a.parents) 

获取兄弟节点
html = ……
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
print(list(enumerater(soup.a.next_siblings)))
print(list(enumerater(soup.a.previous_siblings)))

3、标准的选择器——beautifulsoup库、find_all选择器

find_all (name,attrs,recursive,text,**kwargs)可根据标签名、属性、内容、文档查找内容

3-a、name——beautifulsoup库、find_all选择器

html = ……
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
print(soup.find_all('ul'))
print(type(soup.find_all('ul')[0]))   #把第一个元素拿出来单独看一下它的类型是什么

name、迭代
html = ……
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
for ul in soup.find_all('ul'):
    print(ul.find_all(li))

3-b、attrs——beautifulsoup库、find_all选择器

html = ……
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
print(soup.find_all(attrs = {'id':'list-1'}))
print(soup.find_all(attrs = {'name':'elements'}))  

attrs传入的是一个字典类型,传入的键名就是属性的名称,键值就是属性的值
attrs现在就可以通过属性名进行元素的查找了。对于某些特殊的属性可以不用attrs的类型的属性的查找。soup.find_all支持了id和 class_

html = ……
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
print(soup.find_all(id = 'list-1'))
print(soup.find_all(class_ = 'element'))这样的写法更加方便。class是python的关键字。

3-c、text——beautifulsoup库、find_all选择器
利用text进行选择,也就是根据文本的内容进行选择

html = ……
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
print(soup.find_all(text = 'Foo')

根据文本内容进行选择,里面有两个foo。两个li。上面看了find_all方法

4、find方法——beautifulsoup库、find选择器

find方法: fing,attrs,recursive,text,**kwarge。find 返回单个元素,find_all返回所有元素

5、CSS选择器——beautifulsoup库、CSS选择器

通过select直接传入CSS选择器就可以完成选择

html = ……
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
print(soup.select('.panel .panel-heading')) 
print(soup.select('ul li'))  
print(soup.select('#list-2 .element'))  
print(type(soup.select('ul')[0]))

解析:print(soup.select('.panel .panel-heading')) #中间需要用一个空格来进行分隔。前面打点.
print(soup.select('ul li')) #直接选择标签,选择标签前面不需要加任何内容的
print(soup.select('#list-2 .element')) # 输入空格+点

5-a、CSS层层迭代的选择——beautifulsoup库、CSS选择器

html = ……
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
for ul in soup.select('ul'):
    print(ul.select('li'))

5-b、CSS获取任何属性和内容——beautifulsoup库、CSS选择器

html = ……
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
for ul in soup.select('ul'):
    print(ul['id'])
    print(ul.attrs['id'])

5-c、CSS获取内容——beautifulsoup库、CSS选择器

html = ……
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
for ul in soup.select('li'):
    print(li.get_text())

补充:html
1、超文本标记语言。页面上不仅有文本,还有超文本,超文本指页面内可以包含图片、链接、甚至音乐、程序等费文字元素。
标记语言,只是进行一个化妆而已,文字的构建和化妆跟world很像。
2、在浏览器中使用,用浏览器打开html文件,读取里面内容
3、用标签形式字体
4、通过标签组织结构和内容

PS:还不确定find、find_all是不是选择器,文章错误处请大家多多指正,谢谢

requests库和beautifulsoup库基本语法就总结完毕、内容肯定不是很完善,如果遇见不会的多看官方文档。

不是礼物的礼物——每天学习4小时的地方小梅子的书桌。20190106星期天

其实学习不是很难的事,通过这次总结梳理了自己的思路,筛选出自己不熟悉未掌握的内容。开篇自己说的懵一部分也是因为对某些知识没掌握。接下来就是多看多练该类知识点。慢就是快是有道理的,每周强迫自己输出一篇有质量的文章也非常重要,继续努力。

最后还欠自己一个精确到周到天的学习计划。

.

相关文章

网友评论

    本文标题:总结:requests、beautifulsoup基础语法【崔庆

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