python爬虫系列(2)—— requests和BeautifulSoup
本文主要介绍python爬虫的两大利器:requests和BeautifulSoup库的基本用法。
1. 安装requests和BeautifulSoup库
可以通过3种方式安装:
easy_install
pip
下载源码手动安装
这里只介绍pip安装方式:
pip install requests
pip install BeautifulSoup4
2. requests基本用法示例
# coding:utf-8
import requests
# 下载新浪新闻首页的内容
url = 'http://news.sina.com.cn/china/'
# 用get函数发送GET请求,获取响应
res = requests.get(url)
# 设置响应的编码格式utf-8(默认格式为ISO-8859-1),防止中文出现乱码
res.encoding = 'utf-8'
print type(res)
print res
print res.text
输出:
<class 'requests.models.Response'>
<Response [200]>
<!DOCTYPE html>
<!-- [ published at 2017-04-19 23:30:28 ] -->
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<title>国内新闻_新闻中心_新浪网</title>
<meta name="keywords" content="国内时政,内地新闻">
下面将上面获取到的网页html内容写入到文件中,这里有一点需要注意的是:python是调用ASCII编码解码程序去处理字符流的,当字符不属于ASCII范围时会抛异常(ordinal not in range(128)),所以要提前设置程序的默认编码:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
然后再将响应的html内容存入文件中:
with open('content.txt','w+') as f:
f.write(res.text)
3. BeautifulSoup基本用法
1. 自定义测试html
html = '''
<html>
<body>
<h1 id="title">Hello World</h1>
<a href="#link1" class="link">This is link1</a>
<a href="#link2" class="link">This is link2</a>
</body>
</html>
'''
2. 从html文本中获取soup
from bs4 import BeautifulSoup
# 这里指定解析器为html.parser(python默认的解析器),指定html文档编码为utf-8
soup = BeautifulSoup(html,'html.parser',from_encoding='utf-8')
print type(soup)
#输出:<class 'bs4.BeautifulSoup'>
3. soup.select()函数用法
(1) 获取指定标签的内容
header = soup.select('h1')
print type(header)
print header
print header[0]
print type(header[0])
print header[0].text
# 输出:
'''
<type 'list'>
[<h1 id="title">Hello World</h1>]
<h1 id="title">Hello World</h1>
<class 'bs4.element.Tag'>
Hello World
'''
alinks = soup.select('a')
print [x.text for x in alinks]
# 输出:[u'This is link1', u'This is link2']
(2) 获取指定id的标签的内容(用'#')
title = soup.select('#title')
print type(title)
print title[0].text
# 输出:
'''
<type 'list'>
Hello World
'''
(3) 获取指定class的标签的内容(用'.')
alinks = soup.select('.link')
print [x.text for x in alinks]
# 输出:[u'This is link1', u'This is link2']
(4) 获取a标签的链接(href属性值)
print alinks[0]['href']
# 输出:#link1
(5) 获取一个标签下的所有子标签的text
body = soup.select('body')[0]
print body.text
# 输出:
'''
Hello World
This is link1
This is link2
'''
(6) 获取不存在的标签
aa = soup.select('aa')
print aa
# 输出:[]
(7) 获取自定义属性值
html2 = '<a href="www.test.com" qoo="123" abc="456">This is a link.</a>'
soup2 = BeautifulSoup(html2,'html.parser')
alink = soup2.select('a')[0]
print alink['qoo']
print alink['abc']
# 输出:
'''
123
456
'''
4. soup.find()和soup.find_all()函数用法
(1) find()和find_all()函数原型:
find和find_all函数都可根据多个条件从html文本中查找标签对象,只不过find的返回对象类型为bs4.element.Tag,为查找到的第一个满足条件的Tag;而find_all的返回对象为bs4.element.ResultSet(实际上就是Tag列表),这里主要介绍find函数,find_all函数类似。
find(name=None, attrs={}, recursive=True, text=None, **kwargs)
注:其中name、attrs、text的值都支持正则匹配。
find_all(name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)
注:其中name、attrs、text的值都支持正则匹配。
(2) find函数的用法示例
html = '<p><a href="www.test.com" class="mylink1 mylink2">this is my link</a></p>'
soup = BeautifulSoup(html,'html.parser')
a1 = soup.find('a')
print type(a1)
# 输出:<class 'bs4.element.Tag'>
print a1.name
print a1['href']
print a1['class']
print a1.text
# 输出:
'''
a
www.test.com
[u'mylink1', u'mylink2']
this is my link
'''
# 多个条件的正则匹配:
import re
a2 = soup.find(name = re.compile(r'w+'),class_ = re.compile(r'mylinkd+'),text = re.compile(r'^this.+link$'))
# 注:这里的class属性之所以写成'class_',是为了防止和python关键字class混淆,其他属性名写正常的名就行,不用这样特殊处理
print a2
# 输出:
'''
<a class="mylink1 mylink2" href="www.test.com">this is my link</a>
'''
# find函数的链式调用
a3 = soup.find('p').find('a')
print a3
# 输出:
'''
<a class="mylink1 mylink2" href="www.test.com">this is my link</a>
'''
# attrs参数的用法
# 注:支持正则匹配属性值(包括自定义属性)
import re
html = '<div class="myclass" my-attr="123abc"></div><div class="myclass" my-attr="abc">'
soup = BeautifulSoup(html,'html.parser')
div = soup.find('div',attrs = {'class':'myclass','my-attr':re.compile(r'd+w+')})
print div
# 输出:
'''
<div class="myclass" my-attr="123abc"></div>
'''
4. 网络爬虫基本架构

5. 补充
1. 代理访问
有时候为了避免封IP,或者在某些公司内网访问外网时候,需要用到代理服务器发送请求,代理的用法示例:
import requests
proxies = {'http':'http://proxy.test.com:8080','https':'http://proxy.test.com:8080'} # 其中proxy.test.com即为代理服务器的地址
url = 'https://www.baidu.com' # 这个url为要访问的url
resp = requests.get(url,proxies = proxies)
如果代理服务器需要账号、密码,则可以这样写proxies:
proxies = {'http':'http://{username}:{password}@proxy.test.com:8080','https':'http://{username}:{password}@proxy.test.com:8080'}
2. 向https的url发送请求
有时候向https的url发送请求会报错:ImportError:no module named certifi.
解决方法:在发送请求时关闭校验:verify = False,如:
resp = requests.get('https://test.com',verify = False)
注:也可通过在headers中传相关鉴权参数来解决此问题。
3. httpbin.org
httpbin.org是requests库的作者开发的一个网站,可以专门用来测试requests库的各种功能,其页面如下:

但httpbin.org的服务器在国外,访问速度比较慢。所以需要在本地搭建一个该网站的镜像,方法如下:
前提:安装好requests库,才能基于该网站测试requests库的功能。
pip install gunicorn httpbin
gunicorn httpbin:app
浏览器输入:127.0.0.1:8000,即可访问。
注:以上步骤在windows下会报错:缺少模块pwd.fcanl,在linux下没问题。
4. requests库官方文档
http://docs.python-requests.org/en/master/
原文链接:
https://www.cnblogs.com/jiayongji/p/7118939.html
-END-
识别图中二维码,领取python全套视频资料
python爬虫系列(2)—— requests和BeautifulSoup的更多相关文章
- 爬虫系列(七) requests的基本使用
一.requests 简介 requests 是一个功能强大.简单易用的 HTTP 请求库,可以使用 pip install requests 命令进行安装 下面我们将会介绍 requests 中常用 ...
- Python使用urllib,urllib3,requests库+beautifulsoup爬取网页
Python使用urllib/urllib3/requests库+beautifulsoup爬取网页 urllib urllib3 requests 笔者在爬取时遇到的问题 1.结果不全 2.'抓取失 ...
- $python爬虫系列(2)—— requests和BeautifulSoup库的基本用法
本文主要介绍python爬虫的两大利器:requests和BeautifulSoup库的基本用法. 1. 安装requests和BeautifulSoup库 可以通过3种方式安装: easy_inst ...
- Python爬虫学习三------requests+BeautifulSoup爬取简单网页
第一次第一次用MarkDown来写博客,先试试效果吧! 昨天2018俄罗斯世界杯拉开了大幕,作为一个伪球迷,当然也得为世界杯做出一点贡献啦. 于是今天就编写了一个爬虫程序将腾讯新闻下世界杯专题的相关新 ...
- Python爬虫系列 - 初探:爬取旅游评论
Python爬虫目前是基于requests包,下面是该包的文档,查一些资料还是比较方便. http://docs.python-requests.org/en/master/ POST发送内容格式 爬 ...
- 爬虫基本操作、requests和BeautifulSoup
1. 爬虫基本操作 例如舆情系统: 获取汽车之家新闻放到自己数据库里,创建自己的app,发布内容,注明来源,自己创业. URL指定内容获取到 - 发送Http请求:http://www.autohom ...
- Python爬虫入门——使用requests爬取python岗位招聘数据
爬虫目的 使用requests库和BeautifulSoup4库来爬取拉勾网Python相关岗位数据 爬虫工具 使用Requests库发送http请求,然后用BeautifulSoup库解析HTML文 ...
- Python 爬虫入门(requests)
相信最开始接触Python爬虫学习的同学最初大多使用的是urllib,urllib2.在那之后接触到了第三方库requests,requests完全能满足各种http功能,真的是好用爆了 :D 他们是 ...
- python 爬虫系列教程方法总结及推荐
爬虫,是我学习的比较多的,也是比较了解的.打算写一个系列教程,网上搜罗一下,感觉别人写的已经很好了,我没必要重复造轮子了. 爬虫不过就是访问一个页面然后用一些匹配方式把自己需要的东西摘出来. 而访问页 ...
随机推荐
- nodejs具体解释
文件夹 javascript与node.js javascript与你 因为javascript真正意义上有两种,甚至能够说是三种形态(从最早的作为DHTML进行增强的小工具,到像jQ ...
- exec系列函数(execl,execlp,execle,execv,execvp)使用
本节目标: exec替换进程映像 exec关联函数组(execl.execlp.execle.execv.execvp) 一,exec替换进程映像 在进程的创建上Unix采用了一个独特的方法,它将进程 ...
- No output operations registered, so nothing to execute
SparkStreaming和KafKa结合报错!报错之前代码如下: object KafkaWordCount{ val updateFunc = (iter:Iterator[(String,Se ...
- 关于HTTP的长连接和短连接
1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议. IP协议主要解决网络路由和寻址 ...
- IE9 BUG overflow :auto 底部空白解决方案
今天去升级了到IE9,运行项目的时候发现,我的div显示滚动条时候,用js动态加载进去的内容在光标移动的时候,底部自动被撑大留着空白, IE8 Chrome这些以前都试过 没发现这个问题 研究了好久 ...
- windows下端口占用解决方法-查看和杀死占用端口进程
在Windows下启动程序时有时会遇到端口被占用的情况,由于一个端口同时只能运行一个进程,所以要想启动新的程序就要先把占用该端口的进程给kill掉,具体的命令分为以下三步, 以杀死占用了80端口的进程 ...
- [android] AndroidManifest.xml - 【 manifest -> application】
语法: <application android:allowTaskReparenting=["true" | "false"] android:back ...
- HBase源码学习系列
转自:http://www.cnblogs.com/cenyuhai/tag/hbase%E6%BA%90%E7%A0%81%E7%B3%BB%E5%88%97/ (mark) hbase源码系列(十 ...
- 曲线学习PyQt5方案一
PyQt5官方网站没直接给出API,这个很操蛋啊. PtQt4官方网站有完整的API,C++版本的Qt5也能找到完整的API资料.由于Qt5的C++和Python3的类和函数实现应该是一致的,所以可以 ...
- go * 和 &的区别
类型 *T 是指向 T 类型值的指针.其零值为 nil . var p *int & 操作符会生成一个指向其操作数的指针. i := 42 p = &i * 操作符表示指针指向的底层值 ...