简单抓取网页的代码html
import requests#导入requests包 from bs4 import BeautifulSoup#从bs4中导入BeauifulSoup包 import re#导入正则表达式的包 r = requests.get("http://baidu.com") r.encoding = 'utf-8'#就没有进行其余异常判断了,作个简单的HTML网页的爬虫 soup = BeautifulSoup(r.text) type(soup)#查看当前soup对象的类型 r.head#此后就能够抓取rr对象的属性了,好比head,title,body等
若是要抓取本地的静态网页的代码的话,我曾经抓取不成功,可是我想了其余的办法,仍是使用上述代码,只不过url地址换成了本地的文件地址了而已,须要注意的是,我是在IDEA里面编写而且运行个人HTML代码的,而且经过IDEA生成了一个本地局域网的端口,复制它的路径,再导入url中,便可抓取本地静态HTML代码,若是我把这个浏览器或则IDEA关了的话,则python抓取的时候则会报错。python
下面是爬虫爬取大学排名的代码:jquery
import requests from bs4 import BeautifulSoup allUniv = []#创建一个二维列表,存储全部表格信息 def getHTMLText(url):#获取传入的地址 try:#进行异常的处理 r = requests.get(url,timeout = 30)#参数1:某网页的url地址,参数2:设定每次请求超时时间为n秒 r.raise_for_status()#若是次参数不是200,则产生异常,进入异常处理语句,不然程序继续往下走 r.encoding = 'utf-8'#将获取的内容转码,使中文可以正常显示而不会产生乱码 return r.text#HTTP相应内容的字符串形式,即url对应的页面内容 except: return "" def fillUnivList(soup): data = soup.find_all('tr')#经过soup对象的find_all属性找到抓取的网页中的全部tr标签 for tr in data: ltd = tr.find_all('td')#再在每一个tr标签中找到全部的td标签 if len(ltd) == 0:#若是这一行的tr中的td标签数为0个的话,则跳过这个tr,继续进行下一个 continue singleUniv = []#将这个大学的各项信息载入列表 for td in ltd: singleUniv.append(td.string)#提取已载入singleUniv列表的td标签中的信息, allUniv.append(singleUniv)#提取singleUniv列表中的信息到allUniv列表中 def printUnivList(num): print("{1:^2}{2:{0}^10}{3:{0}^6}{4:{0}^4}{5:{0}^10}".format(chr(12288),"排名","学校名称","省份","总分","培养规模"))#注意输出格式的控制 for i in range(num): u = allUniv[i] print("{1:^2}{2:{0}^10}{3:{0}^6}{4:{0}^4}{5:{0}^10}".format(chr(12288),u[0],u[1],u[2],eval(u[3]),u[6])) def main(num): url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html'#设定网页的地址 html = getHTMLText(url)#将url地址传入函数,返回字符串形式给变量html soup = BeautifulSoup(html,"html.parser")#生成一个soup的对象,此时soup就是一个BeautifulSoup对象 fillUnivList(soup)#将soup对象传入函数 printUnivList(num) main(300)
在代码中都有详细的注释即理解,但愿对你有所帮助。正则表达式
下面是搜索关键字自动提交的爬虫代码:json
import requests from bs4 import BeautifulSoup import re import json def getKeywordResult(keyword): url = 'http://www.baidu.com/s?wd='+keyword try: r = requests.get(url, timeout=30) r.raise_for_status() r.encoding = 'utf-8' return r.text except: return "" def parserLinks(html): soup = BeautifulSoup(html, "html.parser") links = [] for div in soup.find_all('div', {'data-tools': re.compile('title')}): data = div.attrs['data-tools'] #得到属性值 d = json.loads(data) #将属性值转换成字典 links.append(d['title']) #将返回连接的题目返回 return links def main(): html = getKeywordResult('Python语言程序设计基础(第2版)') ls = parserLinks(html) count = 1 for i in ls: print("[{:^3}]{}".format(count, i)) count += 1 main()
相关操做与其步骤的含义与其上的代码一模一样,请仔细参悟浏览器
下面给出requests库的相关属性缓存
requests库是一个简洁且简单的处理HTTP请求的第三方库,它的最大优势是程序边学过程更接近正常URL访问过程。requests库支持很是丰富的连接访问功能,包括国际域名和URL获取、HTTP长链接和链接缓存、HTTP会话和Cookie保持、浏览器使用风格的SSL验证、基本的摘要认证、有效的键值对Cookie记录、自动解压缩、自动内容解码、文件分块上传、HTTP(S)代理功能、链接超时处理、流数据下载等。网络
网络爬虫和信息提交只是requests库能支持的基本功能,requests库中的网页请求函数:app
get(url,timeout = n) 对应HTTP的get方式,获取网页最经常使用的方法,能够增长timeout=n参数,设定每次请求超时时间为n秒函数
post(url,data = {'key':'value'}) 对应HTTP的post方式,其中字典用于传递客户数据
delete(url) 对应于HTTP的delete方式
head(url) 对应于HTTP的head方式
options(url) 对应于HTTP的options方式
put(url,data = {'key':'value'}) 对应于HTTP的put方式,其中字典用于传递客户数据
requests.get()表明请求过程,它返回的Response对象表明响应,Response对象的属性以下:
status_code:HTTP请求的返回状态,整数,200表示链接成功,404表示失败
text:HTTP响应内容的字符串形式,即url对应的页面内容
encoding:HTTP响应内容的编码方式
content:HTTP响应内容的二进制形式
Response对象的方法:
json():若是HTTP响应内容包含JSON格式数据,则该方法解析JSON数据
raise_for_status():若是不是200,则产生异常
-------------------------------------------------------------------------------------------------------------------------
beautifulsoup4库的使用
使用requests库获取HTML页面并将其转化成字符串后,须要进一步解析HTML页面格式,提取有用信息,这须要处理HTML和XML的函数库。beautifulsoup4库,也成为Beautiful Soup库或者bs4库,用于解析和处理HTML和XML。须要注意的是,它不是BeautifulSoup库。它的最大优势是能根据HTML和XML语法创建解析树,进而高效解析其中的内容。beautifulsoup4库采用面向对象思想实现,简单地说,它把每一个页面看成一个对象,经过<a>.<b>()的凡是调用方法(即处理函数),BeautifulSoup中经常使用的一些属性以下:
head:HTML页面的<head>内容
title:HTML页面标题,在<head>之中,有<title>标记
body:HTML页面的<body>内容
p:HTML页面中第一个<p>内容
strings:HTML页面全部呈如今Web上的字符串,即标签的内容
stripped_strings:HTML页面全部呈如今Web上的非空格字符串
BeautifulSoup属性与HTML的标签名称相同,远不止这些。
标签对象的经常使用属性:
name:字符串,标签的名字,好比div
attrs:字典,包含了原来页面Tag全部的属性,好比href
contents:列表,这个Tag下全部子Tag的内容
string:字符串,Tag所包围的文本,网页中真是的文字,string属性的返回值遵循以下原则:
(1)若是标签内部没有其余标签,string属性返回其中的内容。
(2)若是标签内部还有其余标签,但只有一个标签,string属性返回最里面标签的内容。
(3)若是标签内部有超过1层嵌套的标签,string属性返回None(空字符串)。
BeautifulSoup其中的两个方法(这两个方法会遍历整个HTML文档,按照条件返回标签内容):
BeautifulSboup.find_all(name,attrs,recursive,string,limit)
做用:根据参数找到对应的标签,返回列表类型。参数以下:
name:按照tag标签,名字用字符串形式表示,例如div、li。
attrs:按照tag标签属性值检索,须要列出属性名称和值,采用JSON表示。
recursive:设置查找层次,只查找当前标签下一层时使用recursive=False。
string:按照关键字检索string属性内容,采用string=开始。
limit:返回结果的个数,默认返回所有结果。
简单地说,BeautifulSoup的find_all()方法能够根据标签名字、标签属性和内容检索并返回标签列表,经过片断字符串检索时须要使用正则表达式re函数库,re时Python标准库,直接经过import re便可使用。采用re.comlile('jquery')实现对片断字符串(如‘jquery’)的检索。当对标签属性检索时,属性和对应的值采用JSON格式,例如:'src':re.compile('jquery'),其中,键值对中值的部分能够是字符串或者正则表达式。
除了find_all()方法,BeautifulSoup类还提供一个find()方法,它们的区别只是前者返回所有结果然后者返回找到的第一个结果,find_all()函数因为可能返回更多结果,因此采用列表形式:find()函数返回字符串形式。
BeautifulSoup.find(name,attrs,recursive,string)
做用:根据参数找到对应标签,采用字符串返回找到的第一个值。
参数:与find_all()方法同样。