Python归纳 | 爬虫基础知识
1. urllib模块库
Urllib是python内置的HTTP请求库,urllib标准库一共包含以下子包:
urllib.error 由urllib.request引发的异常类
urllib.parse URL解析组件
urllib.request 用于打开网址的可扩展库。
urllib.response urllib使用的响应类。
urllib.robotparser 加载robots.txt文件并回答有关其他网址可抓取性的问题。
使用urllib库进行post操作,如何建立post数据格式?
1 将数据以字典形式建立
2 利用urllib.parse包的urlencode方法:
urlretrieve()函数
urlretrieve()将远程链接数据下载到本地
urlretrieve(url, filename=None, reporthook=None, data=None)
链接、保存本地路径、回调函数、post导服务器的数据
2. Beautiful Soup模块库
Beautiful Soup是一个可以从HTML或XML文件中提取数据的第三方Python库,它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 | BeautifulSoup(markup, "html.parser") | Python的内置标准库执行速度适中文档容错能力强 | Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差 |
lxml HTML 解析器 | BeautifulSoup(markup, "lxml") | 速度快文档容错能力强 | 需要安装C语言库 |
html5lib | BeautifulSoup(markup, "html5lib") | 最好的容错性以浏览器的方式解析文档生成HTML5格式的文档 | 速度慢不依赖外部扩展 |
2.1 创建Beautiful Soup对象
from bs4 import BeautifulSoup
#html为解析的页面获得html信息,为方便讲解,在此定义一个html文件
html = """
<html>
<head>
<title>CRIME</title>
</head>
<body>
<p class="title" name="blog"><b>My Blog</b></p>
<li><!--注释--></li>
<a href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" class="sister" id="link1">Html举例1</a><br/>
<a href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" class="sister" id="link2">Html举例1</a><br/>
<a href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" class="sister" id="link3">Html举例1</a><br/>
</body>
</html>
创建Beautiful Soup对象
soup = BeautifulSoup(html,'lxml')
还可以使用本地HTML文件来创建对象
soup = BeautifulSoup(open(test.html),'lxml')
使用如下代码格式化输出
print(soup.prettify())
2.2 Beautiful Soup四大对象
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
- Tag
- NavigableString
- BeautifulSoup
- Comment
(1) Tag
Tag通俗点讲就是HTML中的一个个标签,例如
<title>CRIME</title> # title就是HTML标签,标签加入里面包括的内容就是Tag
用 Beautiful Soup 获取 Tags
print(soup.title)
#<title>CRIMEi</title>
print(soup.head)
#<head> <title>CRIME</title></head>
print(soup.a)
#<a class="sister" href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" class="sister" id="link1">Html举例1</a>
print(soup.p)
#<p class="title" name="blog"><b>My Blog</b></p>
验证一下这些对象的类型:
print(type(soup.title))
#<class 'bs4.element.Tag'>
Tag有两个重要的属性:name和attrs
name:
print(soup.name)
print(soup.title.name)
#[document]
#title
soup 对象本身比较特殊,它的 name 即为 [document],对于其他内部标签,输出的值便为标签本身的名称。
attrs:
print(soup.a.attrs)
#{'class': ['sister'], 'href': 'http://xxxxx/xxxx/xxxx/xxxx/xxxx', 'id': 'link1'}
把a 标签的所有属性打印输出,得到的类型是一个字典。
如果想要单独获取某个属性,例如我们获取a标签的class叫什么,两个等价的方法如下:
print(soup.a['class'])
print(soup.a.get('class'))
#['sister']
#['sister']
(2) NavigableString
得到了标签的内容,想要获取标签内部的文字,用 .string即可
print(soup.title.string)
#CRIME
(3) BeautifulSoup
BeautifulSoup 对象表示的是一个文档的全部内容。大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性:
print(type(soup.name))
print(soup.name)
print(soup.attrs)
#<class 'str'>
#[document]
#{}
(4) Comment
Comment对象是一个特殊类型的NavigableString对象,其实输出的内容仍然不包括注释符号,但是如果不好好处理它,可能会对我们的文本处理造成意想不到的麻烦。
print(soup.li)
print(soup.li.string)
print(type(soup.li.string))
#<li><!--注释--></li>
#注释
#<class 'bs4.element.Comment'>
li标签里的内容实际上是注释,但是如果我们利用 .string 来输出它的内容,我们发现它已经把注释符号去掉了,所以这可能会给我们带来不必要的麻烦。
我们打印输出下它的类型,发现它是一个 Comment 类型,所以,我们在使用前最好做一下判断,判断代码如下:
from bs4 import element
if type(soup.li.string) == element.Comment:
print(soup.li.string)
上面的代码中,我们首先判断了它的类型,是否为 Comment 类型,然后再进行其他操作,如打印输出。
2.3 遍历文档数
(1) 直接子节点(不包含孙节点)
contents:
tag的content属性可以将tag的子节点以列表的方式输出:
print(soup.body.contents)
#['\n', <p class="title" name="blog"><b>My Blog</b></p>, '\n', <li><!--注释--></li>, '\n', <a class="sister" href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" class="sister" id="link1">Html举例1</a>, <br/>, '\n', <a class="sister" href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" id="link2">Html举例2</a>, <br/>, '\n', <a class="sister" href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" id="link3">Html举例3</a>, <br/>, '\n']
输出方式为列表,我们可以用列表索引来获取它的某一个元素:
print(soup.body.contents[1])
<p class="title" name="blog"><b>My Blog</b></p>
children:
它返回的不是一个 list,不过我们可以通过遍历获取所有子节点,它是一个 list 生成器对象:
for child in soup.body.children:
print(child)
(2) 搜索文档树(find()、find_all()函数)
find_all方法返回文档中所有匹配对象的列表
find_all(name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)
find方法返回第一个可匹配的对象,即find_all(...limit=1...)
find(name=None, attrs={}, recursive=True, text=None , **kwargs )
find与find_all除了返回类型不一样,参数用法都一样,以下以find_all为例
name参数:
name 参数可以查找所有名字为 name 的tag,字符串对象会被自动忽略掉。
传递字符:
最简单的过滤器是字符串,在搜索方法中传入一个字符串参数,Beautiful Soup会查找与字符串完整匹配的内容,下面的例子用于查找文档中所有的<a>
标签:
print(soup.find_all('a'))
#['\n', <p class="title" name="blog"><b>My Blog</b></p>, '\n', <li><!--注释--></li>, '\n', <a class="sister" href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" class="sister" id="link1">Html举例1</a>, <br/>, '\n', <a class="sister" href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" id="link2">Html举例2</a>, <br/>, '\n', <a class="sister" href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" id="link3">Html举例3</a>, <br/>, '\n']
传递正则表达式:
如果传入正则表达式作为参数,Beautiful Soup会通过正则表达式的 match() 来匹配内容.下面例子中找出所有以b开头的标签,这表示和<b>
标签都应该被找到
import re
for tag in soup.find_all(re.compile("^b")):
print(tag.name)
#body
#b
#br
#br
#br
传递列表:
如果传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回,下面代码找到文档中所有title标签和b标签:
print(soup.find_all(['title','b']))
#[<title>Jack_Cui</title>, <b>My Blog</b>]
传递True:
True 可以匹配任何值,下面代码查找到所有的tag,但是不会返回字符串节点:
for tag in soup.find_all(True):
print(tag.name)
#html
#head
...
#br
attrs参数:
我们可以通过 find_all() 方法的 attrs 参数定义一个字典参数来搜索包含特殊属性的tag。
print(soup.find_all(attrs={"class":"title"}))
#[<p class="title" name="blog"><b>My Blog</b></p>]
recursive参数:
调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False。
text参数:
通过 text 参数可以搜搜文档中的字符串内容,与 name 参数的可选值一样, text 参数接受字符串 , 正则表达式 , 列表, True。
print(soup.find_all(text="Python3网络爬虫(三):urllib.error异常"))
#['Python3网络爬虫(三):urllib.error异常']
limit参数:
find_all() 方法返回全部的搜索结构,如果文档树很大那么搜索会很慢.如果我们不需要全部结果,可以使用 limit 参数限制返回结果的数量.效果与SQL中的limit关键字类似,当搜索到的结果数量达到 limit 的限制时,就停止搜索返回结果。
文档树中有3个tag符合搜索条件,但结果只返回了2个,因为我们限制了返回数量:
print(soup.find_all("a", limit=2))
#[<a class="sister" href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" id="link1">Html事例1</a>, <a class="sister" href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" id="link2">Html事例2</a>]
attrs参数:
如果传入 class 参数,Beautiful Soup 会搜索每个 class 属性为 title 的 tag 。kwargs 接收字符串,正则表达式
print(soup.find_all(class_="title"))
#[<p class="title" name="blog"><b>My Blog</b></p>]
Python爬虫入门实战
爬虫流程
- 先由urllib的request打开Url得到网页html文档
- 浏览器打开网页源代码分析元素节点
- 通过Beautiful Soup或则正则表达式提取想要的数据
- 存储数据到本地磁盘或数据库(抓取,分析,存储)
练习一:对豆瓣的一个电影排名URL进行抓取
from urllib import request #导入urillib中的request模块
from bs4 import BeautifulSoup #导入bs4中的BeautifulSoup模块
##构造头文件,模拟浏览器访问
url="https://movie.douban.com/chart"
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
page = request.Request(url,headers=headers) #用urllib的request打开Url得到网页html文档
page_info = request.urlopen(page).read().decode('utf-8') #打开Url,获取HttpResponse返回对象并读取其ResposneBody
soup = BeautifulSoup(page_info, 'html.parser') # 将获取到的内容转换成BeautifulSoup格式,并将html.parser作为解析器
titles = soup.find('div','indent') # 查找所有div标签中class='indent'的Tag
for t in titles.find_all('a',class_="nbg"): # 查找所有a标签中class=nbg的Tag(隐藏的class属性不解!!!!)
print(t.attrs['title']) # 打印查找到的每一个a标签中的title
print(t.attrs['href']) #打印查找到的每一个a标签中的文章链接href
#在磁盘以只写的方式打开/创建一个名为 articles 的txt文件
#open()是读写文件的函数,with语句会自动close()已打开文件
with open(r"D:\BaiduYunDownload\articles.txt","w") as file:
for t in titles.find_all('a',class_="nbg"):
file.write(t.attrs['title']+'\n')
file.write(t.get('href')+'\n\n')
练习二:爬取169图片并保存到本地
from urllib import request #导入urillib中的request模块
from bs4 import BeautifulSoup #导入bs4中的BeautifulSoup模块
import re
import time
def getImg(url):
##构造头文件,模拟浏览器访问
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
page = request.Request(url,headers=headers)
#用request打开Url,获取HttpResponse返回对象并读取其ResposneBody
html=request.urlopen(page).read().decode('utf-8','ignore')
#将获取到的内容转换成BeautifulSoup格式,并将html.parser作为解析器
soup = BeautifulSoup(html, 'html.parser')
links=soup.find('div',class_='big_img') #获取标签为div,class属性为big_img的对象
for link in links.find_all('img',src=re.compile(r'.jpg$')): #获取标签为img,无class属性,以.jpg结尾的src属性列表并迭代对象
path = r'D:\BaiduYunDownload\IMG'
request.urlretrieve(link.attrs['src'],path+'\%s.jpg' % time.time()) #使用request.urlretrieve()直接将所有远程链接数据下载到本地,link.attr返回的是一个属性字典
if __name__=="__main__":
url=input("请输入网址:")
n=int(input("请输入页数:"))
getImg(url)
for i in range(2,n+1):
url2=url[0:47]+"_"+str(i)+".html"
getImg(url2)
3. Requests模块库
4. lxml库XPath模块
Python爬虫入门实战
import requests
from lxml import etree
import re
url=str(input('请输入网址:'))
file_name=str(input('请输入文件夹名:'))
headers = { "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" }
count=0
flag=1
while flag:
req =requests.get(url,headers=headers).content
html=etree.HTML(req)
element =html.xpath('//p/img/@src')
for i in element:
r = requests.get(i)
count=count+1
print('下载第{}张'.format(count))
with open("D:/BaiduYunDownload/IMG/"+str(file_name)+str(count)+".jpg", "wb") as f:
f.write(r.content)
judge=html.xpath('//ul[@class="pagelist"]/li[last()]/@class')
if judge==['thisclass']:
flag=0
urls=html.xpath('//div/ul[@class="pagelist"]/li[last()]/a/@href')[0]
url=url[:46]+urls
print("完成")
Python归纳 | 爬虫基础知识的更多相关文章
- 自学Python四 爬虫基础知识储备
首先,推荐两个关于python爬虫不错的博客:Python爬虫入门教程专栏 和 Python爬虫学习系列教程 .写的都非常不错,我学习到了很多东西!在此,我就我看到的学到的进行总结一下! 爬虫就是 ...
- Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现
Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现 一丶进程基础知识 什么是程序: 程序就是一堆文件 什么是进程: 进程就是一个正在 ...
- Python开发(一):Python介绍与基础知识
Python开发(一):Python介绍与基础知识 本次内容 一:Python介绍: 二:Python是一门什么语言 三:Python:安装 四:第一个程序 “Hello world” 五:Pytho ...
- python 爬虫基础知识一
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 网络爬虫必备知识点 1. Python基础知识2. P ...
- Python 爬虫基础知识
requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作, ...
- python网络爬虫,知识储备,简单爬虫的必知必会,【核心】
知识储备,简单爬虫的必知必会,[核心] 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌 ...
- python从爬虫基础到爬取网络小说实例
一.爬虫基础 1.1 requests类 1.1.1 request的7个方法 requests.request() 实例化一个对象,拥有以下方法 requests.get(url, *args) r ...
- Python扫描器-爬虫基础
0x1.基础框架原理 1.1.爬虫基础 爬虫程序主要原理就是模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中 1.1.基础原理 1.发起HTTP请求 2 ...
- 基于Python的Flask基础知识
Flask简介 Flask 是一个使用 Python 编写的轻量级 Web 应用程序框架.Armin Ronacher带领一个名为Pocco的国际Python爱好者团队开发了Flask. 下面我们简单 ...
随机推荐
- 删除一个数的K位使原数变得最小
原创 给定一个n位正整数a, 去掉其中k个数字后按原左右次序将组成一个新的正整数.对给定的a, k寻找一种方案,使得剩下的数字组成的新数最小. 提示:应用贪心算法设计求解 操作对象为n位正整数,有可能 ...
- log4net工作原理(2)
上回说道:Repository可以说成基于一个log4net配置节创建的log4net容器,它根据log4net配置节的指示创建其他所有对象(Logger/Appender/Filter/Layout ...
- EIP权限工作流平台-升级说明(2018-12-04)
表单生成器,文本框新增验证(默认验证及正则表达式) 列表查询支持复杂查询,支持文本框,下拉框,时间查询
- NSValue 值
前言 将任意数据类型包装成 OC 对象 1.比较两个 NSValue 类型数据的大小 NSValue *value1 = [NSValue valueWithPoint:NSMakePoint(10, ...
- python自带的排列组合函数
需求: 在你的面前有一个n阶的台阶,你一步只能上1级或者2级,请计算出你可以采用多少种不同的方法爬完这个楼梯?输入一个正整数表示这个台阶的级数,输出一个正整数表示有多少种方法爬完这个楼梯. 分析:提炼 ...
- 从HDU1004来看C++<map>
最近做题有点浮躁~于是从HDU第一题开始刷,刷到1004题的时候突发奇想来复习一发很久没有用到过的map 题意是给你n个气球,每个气球有一种颜色,让你求出数量最多的气球颜色 因为颜色是气球数量的识别关 ...
- javascript中类数组转成真正的数组
function list() { return Array.prototype.slice.call(arguments); } var list1 = list(1, 2, 3); // [1, ...
- Windows Server 2008 R2中IIS7.5配置完网站权限不足问题的解决办法:
Windows Server 2008 R2中IIS7.5配置完网站权限不足问题的解决办法:常见问题:HTTP 错误 500.0 - Internal Server Error无法显示页面,因为发生内 ...
- css grid学习笔记
仅为自己用而收藏罢了 w3c官方文档 https://www.w3.org/TR/css-grid-1/#grid-items w3cplus(zhongwenban ) 大漠博主的系列文章 基础知识 ...
- win7/win8/win10 系统
WIN7/WIN8/WIN10 系统安装 http://www.windows7en.com/Win7/18572.html