网站制作公司 佛山,策划一个网站,网站图解图片是用什么软件做的,网站收录系统目录 1.网络爬虫简介2.使用urllib3.使用request4.使用BeautifulSoup 1.网络爬虫简介
网络爬虫是一种按照一定的规则#xff0c;自动爬去万维网信息的程序或脚本。一般从某个网站某个网页开始#xff0c;读取网页的内容#xff0c;同时检索页面包含的有用链接地址#xff0… 目录 1.网络爬虫简介2.使用urllib3.使用request4.使用BeautifulSoup 1.网络爬虫简介
网络爬虫是一种按照一定的规则自动爬去万维网信息的程序或脚本。一般从某个网站某个网页开始读取网页的内容同时检索页面包含的有用链接地址然后通过这些链接地址寻找下一个网页再做相同的工作一直循环下去直到按照某种策略把互联网所有的网页都抓完为止。
网络爬虫的分类
网络爬虫大致有4种类型通过网络爬虫、聚焦网络爬虫、增量式网络爬虫、深层网络爬虫。
通用网络爬虫爬取的目标数据巨大并且范围非常广性能要求非常高。主要应用在大型搜索引擎中有非常高的应用价值或者应用于大型数据提供商。聚焦网络爬虫按照预先定义好的主题有选择地进行网页爬取的一种爬虫。将爬取的目标网页定位在与主题相关的页面中大大节省爬虫爬取时所需要的带宽资源和服务器资源。主要应用在对特定信息的爬取中为某一类特定的人群提供服务。增量式网络爬虫在爬取网页的时候只爬取内容发生变化的网页或者新产生的网页对于内容未变化的网页则不会爬。增量式网络爬虫在一定的程度上能够保证爬取的页面尽可能是新页面。深层网络爬虫网页按存在方式可以分为表层页面和深层页面。表层页面指不需要提交表单使用静态的链接就能够到达的静态页面深层页面则隐藏在表单后面不能通过静态链接直接获取需要提交一定的关键词之后才能获取的页面。
网络爬虫的作用
1搜索引擎为用户提供相关且有效的内容创建所有访问页面的快照以供后续处理。使用聚焦网络爬虫实现任何门户网站上的搜索引擎或搜索功能有助于找到与搜索主题具有最高相关性的网页。
2建立数据集用于研究、业务和其他目的。
了解和分析网民对公司或组织的行为。收集营销信息并在短期内更好地做出营销决策。从互联网收集信息分析他们并进行学术研究。收集数据分析一个行业的长期发展趋势。监控竞争对手的实时变化。
网络爬虫的工作流程
预先设定一个或若干个初始种子URL开始以此获得初始网页上的URL列表在爬行过程中不断从URL队列中获取URL进而访问并下载该页面。
当页面下载后页面解析器去掉页面上的HTML标记并得到页面内容将摘要、URL等信息保存到Web数据库中同时抽取当前网页上新的URL推入URL队列知道满足系统停止条件。
2.使用urllib
python2urlliburllib2
python3urllib2urllib3
urllib 是Python中请求URL连接的官方标准库共有4个模块
urllib.request主要负责构造和发起网络请求定义了适用于各种复杂情况下打开URL的函数和类。urllib.error异常处理。urllib.parse解析各种数据格式。urllib.robotparser解析robots.txt文件。
发起请求 http.client.HTTPResponse urllib.request.urlopen(url,data,timeout,cafile,capath,context)
cafile,capath 使用https时使用
http.client.HTTPResponse urllib.request.urlopen(urllib.request.Request)
返回响应对象import urllib.request
baidu_url http://www.baidu.com
sina_url http://www.sina.com
r urllib.request.urlopen(sina_url) # 发起请求返回响应对象
h r.read().decode(utf-8) # 读取数据并解码
print(h)提交数据使用data参数提交数据
import urllib.request
import urllib.parsebaidu_url http://www.baidu.com
sina_url http://www.sina.com
p {name:Python,author:admin
}
d bytes(urllib.parse.urlencode(p),encodingutf8) # 进行编码将字典转化为字符串再字节流
r urllib.request.urlopen(sina_url,datad,timeout1) # 传入参数发起请求返回响应对象
h r.read().decode(utf-8) # 读取数据并解码
print(h)设置请求头需要指定请求头 urllib.request.Request(url,dataNone,headers{},origin_req_hostNone,unverifiableFalse,methodNone)# 浏览器开发者工具标头
# urllib.request.Request(url,dataNone,headers{},origin_req_hostNone,unverifiableFalse,methodNone)
import urllib.request
baidu_url http://www.baidu.com
headers {User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
}
req urllib.request.Request(urlbaidu_url,headersheaders)
r urllib.request.urlopen(req)
h r.read().decode(utf-8)
print(h)使用代理处理cookie等信息时。 Handler
OpenerDirectorimport urllib.request
baidu_url http://www.baidu.com
headers {User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
}
# 通过第三方服务器寻找具有实效性可设置多个
proxy urllib.request.ProxyHandler({http:125.71.212.17:9000,http:113.71.212.17:9000}
)
opener urllib.request.build_opener(proxy) # 创建代理
urllib.request.install_opener(opener) # 安装代理
req urllib.request.Request(urlbaidu_url,headersheaders)
r urllib.request.urlopen(req)
h r.read().decode(utf-8)
print(h)认证登录需要先登入才能访问浏览页面。
创建一个账号密码管理对象。添加账号和密码。获取一个handler对象。获取opener对象。使用open()函数发起请求。
import urllib.request
url http://cnblogs.com/xtznb
user user
password password
pwdmgr urllib.request.HTTPPasswordMgrWithDefaultRealm() # 创建一个账号密码管理对象
pwdmgr.add_password(None,url,user,password) # 添加账号和密码
auth_handler urllib.request.HTTPBasicAuthHandler(pwdmgr) # 获取一个handler对象
opener urllib.request.build_opener(auth_handler) # 获取opener对象
response opener.open(url) # 使用open()函数发起请求
print(response.read().decode(utf-8))设置Cookies页面每次需要生成验证可以使用Cookies自动登入。
实例化Cookies对象。构建一个handler对象。使用opener对象的open()发起请求。
import urllib.request
import http.cookiejar
url http://tieba.baidu.com
file cookie.txt
cookie http.cookiejar.CookieJar() # 实例化Cookies对象
handler urllib.request.HTTPCookieProcessor(cookie) # 构建一个handler对象
opener urllib.request.build_opener(handler)
response opener.open(url) # 使用opener对象的open()发起请求
f open(file,a) # 追加模式写入
for i in cookie: # 迭代写入信息f.write(i.name i.value \n)
f.close() # 关闭文件3.使用request
requests模块是在urllib3模块基础上进行了高度封装使用更方便网络请求也变得更加简洁和人性化。在爬取数据时urllib爬取数据之后直接断开连接而requests爬取数据之后可以继续复用socket并没有断开连接。
发起GET请求
使用requests模块的get()方法可以发送GET请求。 response get(url,paramsNone,**kwargs)
url请求的URL地址
params字典或字节序列作为参数增加到URL中
**kwargs控制访问的参数import requests
r requests.get(http://www.baidu.com)
print(r.url) # http://www.baidu.com/
print(r.cookies) # RequestsCookieJar[Cookie BDORZ27315 for .baidu.com/]
r.encoding utf-8
print(r.encoding) # utf-8
print(r.text) # 网页源代码
print(r.content) # 二进制字节流
print(r.headers) # 文件头
print(r.status_code) # 状态码
# 手工附加
r requests.get(http://www.baidu.com/?keyval)
# 使用params关键字参数
payload1 {key1:value1,key2:value2}
r requests.get(http://www.baidu.com,paramspayload1)
payload2 {key1:value1,key2:[value2,value3]}
r requests.get(http://www.baidu.com,paramspayload2)
# 请求头形式
headers {Content-Type:text/html; charsetutf-8,User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
}
r requests.get(http://www.baidu.com,headersheaders)
# 设置代理
headers {Content-Type:text/html; charsetutf-8,User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
}
p {http:120.25.253.234.0000
}
r requests.get(http://www.baidu.com,headersheaders,proxiesp)也可以使用timeout参数设置延时时间使用verify参数设置整数验证使用cookies参数传递cookie信息等。 发送POST请求
HTTP协议规定POST提交的数据必须放在消息主题中但协议并没有规定数据必须使用什么编码方式具体的编码方式有3种
form表单形式application/x-www-form-urlencodedJSON字符串提交数据application/json上传文件multipart/form-data
发送POST请求可以使用post()方法也返回一个Response对象。
示例1form形式发送POST请求。
import requests
payload {key1:value1,key2:value2}
r requests.post(http://httpbin.org/post,paramspayload)
print(r.text)
输出
{args: {key1: value1, key2: value2}, data: , files: {}, form: {}, headers: {Accept: */*, Accept-Encoding: gzip, deflate, Content-Length: 0, Host: httpbin.org, User-Agent: python-requests/2.27.1, X-Amzn-Trace-Id: Root1-656f516d-18cccab474d121d705eb3ad9}, json: null, origin: 218.104.29.129, url: http://httpbin.org/post?key1value1key2value2
}示例2JSON格式发送POST请求。
import requests
import json
payload {key1:value1,key2:value2}
r requests.post(http://httpbin.org/post,datajson.dumps(payload))
print(r.text){args: {}, data: {\key1\: \value1\, \key2\: \value2\}, files: {}, form: {}, headers: {Accept: */*, Accept-Encoding: gzip, deflate, Content-Length: 36, Host: httpbin.org, User-Agent: python-requests/2.27.1, X-Amzn-Trace-Id: Root1-656f5282-3f08151e1fbbeec54501ed80}, json: {key1: value1, key2: value2}, origin: 218.104.29.129, url: http://httpbin.org/post
}示例3上传文件发送POST请求。
# 新建文本文件report.txt输入一行Hello world
import requests
files {file:open(report.txt,rb)}
r requests.post(http://httpbin.org/post,filesfiles)
print(r.text){args: {}, data: , files: {file: Hello world}, form: {}, headers: {Accept: */*, Accept-Encoding: gzip, deflate, Content-Length: 157, Content-Type: multipart/form-data; boundary44a0c52d3705bdc2a8a6ffa85ccc00bc, Host: httpbin.org, User-Agent: python-requests/2.27.1, X-Amzn-Trace-Id: Root1-656f538f-5c062ec1599c4fbe082aa840}, json: null, origin: 218.104.29.129, url: http://httpbin.org/post
}requests 不仅提供了GET和POST请求方式还提供了其他请求方式put、delete、head、options。
GET主要用于从指定的资源请求数据而POST主要用于向指定的资源提交要被处理的数据。
4.使用BeautifulSoup
使用requests模块仅能抓去一些网页源码但是如何对源码进行筛选、过滤精确找到需要的数据就要用到BeautifulSoup。它是一个可以从HTML或XML文件中提取数据的Python库。
BeautifulSoup支持Python标准库种的HTML解析器还支持一些第三方的解析器如果不安装则python默认的解析器lxml解析器就更加强大速度更快推荐使用lxml解析器。
解析器字符串
html.parserBeautifulSoup(html,html.parser)默认执行速度一般容错能力强。lxmlBeautifulSoup(html,lxml)速度快文档容错能力强。xmlBeautifulSoup(html,xml)速度快主要针对XML文档。html5libBeautifulSoup(html,html5lib)最好的容错性主要针对HTML5文档。 BeautifulSoup自动将输入文档转换为Unicode编码输出文档转换为UTF-8编码。 环境配置 pip install beautifulsoup4
# 需要调用HTML解析器安装如下
pip install html5lib
pip install lxml示例3
# 新建test.html输入以下内容
!DOCTYPE html
html
headmeta charsetutf-8titleHello,world/title
/head
body
div classbookspan!--这里是注释的部分--/spana hrefhttps://www.baidu.com百度一下你就知道/ap classa这是一个示例/p
/div
/body
/html# 新建py文件
from bs4 import BeautifulSoup
f open(paichong/test.html,r,encodingutf-8) # 打开文件
html f.read()
f.close()
soup BeautifulSoup(html,html5lib) # 指定html5lib解析器
print(type(soup))节点对象
BeautifulSoup将复杂HTML文档转换成一个复杂的树形结构每个节点都是Python对象对象归纳为Tag、NavigableString、BeautifulSoup、Comment。
Tag标签NavigableString标签包裹的文本BeautifulSoup解析网页所得到的对象Comment注释或者特殊字符串。
from bs4 import BeautifulSoup
f open(paichong/test.html,r,encodingutf-8) # 打开文件
html f.read()
f.close()
soup BeautifulSoup(html,html5lib) # 指定html5lib解析器
print(type(soup))
tag soup.p # 读取p标签
print(tag.name) # 读取p标签名称
print(tag[class]) # 属性值
print(tag.get_text()) # 文本文档遍历
遍历节点属性如下
contents获取所有字节点包含NavigableString对象返回的是一个列表。children获取所有子节点返回的是一个迭代器。descendants获取所有子孙节点返回的是一个迭代器。string获取直接包含的文本。strings获取全部包含的文本返回一个可迭代对象。parent获取上一层父节点。parents获取父辈节点返回一个可迭代对象。next_sibling获取当前节点的下一个兄弟节点。next_siblings获取当前节点的下方所有兄弟节点。previous_sibling获取当前节点的上一个兄弟节点。previous_siblings获取当前节点的上方所有兄弟节点。
from bs4 import BeautifulSoup
f open(paichong/test.html,r,encodingutf-8) # 打开文件
html f.read()
f.close()
soup BeautifulSoup(html,html5lib) # 指定html5lib解析器
tags soup.head.children # 获取head的所有子节点
print(tags)
for tag in tags:print(tag)文档搜索
find_all(name[,name1,…])name为标签名称直接标签字符串过滤。find_all(attires {‘属性名称’:‘属性值’}) 搜索属性。find_all(name,text”文本内容“) 搜索文本find_all(name,recursiveFalse)限制查找范围。find_all(re.compile(”b”))正则表达式。
a soup.find_all(a,text百度一下你就知道)
a soup.find_all(re.compile(a))
print(a)CSS选择器
select() 方法传入字符串参数。详细见http://www.w3.org/TR/CSS2/selector.html。
from bs4 import BeautifulSoup
import re
f open(paichong/test.html,r,encodingutf-8) # 打开文件
html f.read()
f.close()
soup BeautifulSoup(html,html5lib) # 指定html5lib解析器
tags soup.select(.a)
print(tags) # [p classa这是一个示例/p]