网络爬虫简介
也叫网络蜘蛛。根据URL(网页地址)爬取网页内容。
URL : 我们再浏览器中输入的网站链接。
URL
统一资源定位符,三部分组成:protocol,**hostname[:port]**,path
- protocol:第一部分就是协议,例如百度使用的就是https协议;
- **hostname[:port]**:第二部分就是主机名,服务器的ip地址(还有端口号为可选参数),一般网站默认的端口号为80,例如百度的ip地址为百度一下,你就知道 域名是www.baidu.com,这个就是服务器的地址;
- path:第三部分就是主机资源的具体地址,如目录和文件名等。
IP地址与域名
IP地址代表不同主机。但IP地址都是有一串0到9的数字组成,人们很容易混淆不容易记忆,所以又发明一套更方便记忆的标识符号,这就是域名。
域名通常也是由数字和字母组成,但大多都与公司、品牌等关联度较大,所以人们很容易记忆,也不容易记错。
我们平时输入域名,大多数情况下都能打开对应的服务器,但实际上,计算机不能直接识别域名,所以必须通过某种方式将域名翻译为IP地址才能完成访问。
DNS解析
这个翻译环节就是DNS解析,DNS解析由一系列比较复杂的流程和机制将域名翻译为IP地址。我们在浏览器上输入某个域名,系统会首先查看本机中的各种缓存文件,查找是否存在对应的IP地址,如果有直接完成访问。如果本机没有记录,就会通过DNS服务器进行全球查询,直到获得该域名对应的IP地址。然后将这个IP地址返回给客户端,从而完成访问。
打个比较通俗的比方:我们可以通过电话号码联系到某人,但我们不可能记住所有人的电话号码,所以我们就需要一个电话簿记录所有人的电话号码,我们想给谁打电话,直接看姓名,然后再看对应的电话号码,这样就方便了许多。
在上面这个场景中IP地址就相当于电话号码,联系人姓名相当于域名,而电话簿就充当了DNS的角色。
端口与协议
http 协议
https 协议 :HTTP下加入SSL层 ,HTTP的安全版
安全基础是SSL,通过它传输的内容都是经过SSL加密的,主要作用:
(1) 建立一个信息安全通道,来保证数据传输的安全
(2) 认网站的真实性,凡是使用了HTTPS的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,也可以通过CA机构颁发的安全签章来查询
审查元素
客服端和服务器
远程的计算机 客户端向服务器发起的是请求,服务器向客户端返回的响应。
在网页处右键点击,点击检查选项(不同浏览器的叫法不同,chrome浏览器叫做检测,firefox浏览器叫做查看元素,但功能相同)
HTML(超文本标记语言)
# 见课件
实例
网络爬虫的第一步就是根据 URL ,获取网页的 HTML 信息。在 Python3 中,可以使用 urllib.request 和 requests 进行网页爬取。
- urllib库是python内置的,无需我们额外安装,只要安装了python就可以使用这个库。
- requests库是第三方库,需要我们字节安装。但是request强大好用
本次学习用的最多的是 requests.get() 获取HTML网页的主要方法,就是从服务器得到、抓取数据,也就是获取数据。
requests.get()方法必须设置的一个参数就是 url
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
target = "http://fanyi.baidu.com/"
req = requests.get(url = target)
req.encoding = 'utf-8'
print(req.text)
encoding = 'utf-8' 代码属性
connection 连接
content 字节形式源码
text 字符串形式源码
cookies 保存用户信息
encoding
headers 头部信息
histery 历史信息
url
网页结构
网页的组成
HTML、CSS和JavaScript
HTML相当于骨架,CSS相当于皮肤JavaScript相当于肌肉
(1) HTML(Hyper Text Markup Language): 超文本标记语言,内部包含大量不同种类标签来展示不同的元素,各种标签通过不同的排列和嵌套就可以形成网页的框架;
(2) CSS(Cascading Style Sheets): 层叠样式表,指当在 HTML 中引用了数个样式文件,并且样式发生冲突时,浏览器能依据层叠顺序处理;
(3) JavaScript: 简称JS,是一种脚本语言,实现了一种实时、动态、交互的页面功能;
网页的构成
HTML 标签是 HTML 语言中最基本的单位,是 HTML 最重要的组成部分
开始标签 * | 元素内容 | 结束标签 * |
---|---|---|
<p> | 这是一个段落 | </p> |
<a href="default.htm"> | 这是一个链接 | </a> |
<br> | 这是一个换行标签 | `` |
常用
单闭合标签
标签 | 功能 |
---|---|
<br /> | 插入一个换行简单的换行符 |
<hr/> | 定义水平线 |
<img /> | 定义图像 |
<input /> | 定义输入控件 |
<link/> | 定义文档与外部资源的关系 |
<mete/> | 定义关于 HTML 文档的元信息 |
字体标签
标签 | 功能 |
---|---|
\<h1>...\</h1> | 标题字(最大) |
<h6>...</h6> | 标题字(最小) |
<b>...</b> | 粗体字 |
<i>...</i> | 斜体字 |
<em>...</em> | 斜体字(强调) |
<u>...</u> | 底线 |
<strike>...</strike> | 横线 |
<s>...</s> | 删除线 |
<del>...</del> | 删除线(表示删除) |
<xmp>...</xmp> | 固定宽度字体(在文件中空白、换行、定位功能有效) |
<listing>...</listing> | 固定宽度小字体 |
<font color=00ff00>...</font> | 字体颜色 |
<font size=1>...</font> | 最小字体 |
<font style =font-size:100 px>...</font> | 无限增大 |
超链接标签
标签 | 功能 |
---|---|
<base href=地址> | (预设好连结路径) |
<a href=地址></a> | 外部连结 |
<a href=地址 target=_blank></a> | 外部连结(另开新窗口) |
<a href=地址 target=_top></a> | 外部连结(全窗口连结) |
<a href=地址 target=页框名></a> | 外部连结(在指定页框连结) |
超文本标签
标签 | 功能 |
---|---|
<img src=图片地址> | 贴图 |
<img src=图片地址 width=180> | 设定图片宽度 |
<img src=图片地址 height=30> | 设定图片高度 |
<img src=图片地址 alt=提示文字> | 设定图片提示文字 |
<img src=图片地址 border=1> | 设定图片边框 |
<bgsound src=MID音乐文件地址> | 背景音乐设定 |
表格标签
标签 | 功能 |
---|---|
<table align=left>...</table> | 表格位置,置左 |
<table align=center>...</table> | 表格位置,置中 |
<table background=图片路径>...</table> | 背景图片的URL=就是路径网址 |
<table border=边框大小>...</table> | 设定表格边框大小(使用数字) |
<table bgcolor=颜色码>...</table> | 设定表格的背景颜色 |
<table borderclor=颜色码>...</table> | 设定表格边框的颜色 |
<table borderclordark=颜色码>...</table> | 设定表格暗边框的颜色 |
<table borderclorlight=颜色码>...</table> | 设定表格亮边框的颜色 |
<table cellpadding=参数>...</table> | 指定内容与网格线之间的间距(使用数字) |
<table cellspacing=参数>...</table> | 指定网格线与网格线之间的距离(使用数字) |
<table cols=参数>...</table> | 指定表格的栏数 |
<table frame=参数>...</table> | 设定表格外框线的显示方式 |
<table width=宽度>...</table> | 指定表格的宽度大小(使用数字) |
<table height=高度>...</table> | 指定表格的高度大小(使用数字) |
<td colspan=参数>...</td> | 指定储存格合并栏的栏数(使用数字) |
<td rowspan=参数>...</td> | 指定储存格合并列的列数(使用数字) |
跑马灯标签
标签 | 功能 |
---|---|
<marquee>...</marquee> | 普通卷动 |
<marquee behavior=slide>...</marquee> | 滑动 |
<marquee behavior=scroll>...</marquee> | 预设卷动 |
<marquee behavior=alternate>...</marquee> | 来回卷动 |
<marquee direction=down>...</marquee> | 向下卷动 |
<marquee direction=up>...</marquee> | 向上卷动 |
<marquee direction=right>...</marquee> | 向右卷动 |
<marquee direction=left>...</marquee> | 向左卷动 |
<marquee loop=2>...</marquee> | 卷动次数 |
<marquee width=180>...</marquee> | 设定宽度 |
<marquee height=30>...</marquee> | 设定高度 |
<marquee bgcolor=ff0000>...</marquee> | 设定背景颜色 |
<marquee scrollamount=30>...</marquee> | 设定卷动距离 |
<marquee scrolldelay=300>...</marquee> | 设定卷动时间 |
常用的html元素属性
属性 | 描述 |
---|---|
class | 为html元素定义一个或多个类名(classname)(类名从样式文件引入) |
id | 定义元素的唯一id |
style | 规定元素的行内样式(inline style) |
例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
table{
/*设置边框合并*/
border-collapse: collapse;
}
img{
height:100px;
width:100px;
}
h1{
color:pink;
}
marquee{
color: red;
}
li{
font-size:24px;
}
</style>
<!--注释-->
</head>
<body>
<h1>主题内容:</h1>
<ul>
<li>各种标签</li>√
<li>按照自己思想写一个简单网页</li>
</ul>
<br>
1、各种标签
<br>
2、写一个简单网页
<br>--------例1--------------
<br>
text 文本框 password 密码 <br>
<input id='content' type='text'>
<input type="button"value="百度一下" onclick="f()">
<br>
账号: <input type="text">
<br>
密码: <input type="password">
<br>
<input type="button"value="登录">
<br>--------例2--------------
<h2>二级标题</h2>
<h3>三级标题</h3>
<b> b标签:粗体字标签 </b><br>
<i> i标签:斜体字标签 </i><br>
<u> u标签:底线标签 </u><br>
<del> del标签:删除线标签 </del>
<br>
<font size="24"> font 字体标签</font>
<br>----------例3--------------
<br>
a标签跳转 <br>
<a href="https://www.cnxincai.com/schoolreception/cloudTalents/country/index?sId=26b2cd2f06e947438d94b32f199e17b0">今日头条</a>
<br>
img 图片标签 <br>
<img src="微信图片_20230314201056.jpg" alt="微信图片">
<br>
<br>----------例4---------------
列表 <br>
<table>
<tr>
<td>100</td>
<td>100</td>
<td>100</td>
<td>100</td>
</tr>
<tr>
<td>100</td>
<td>100</td>
<td>100</td>
<td>100</td>
</tr>
<tr>
<td>100</td>
<td>100</td>
<td>100</td>
<td>100</td>
</tr>
</table>
<br>
<br>-------------例5-------------
<marquee behavior=slide>天空飘来五个字,那都不是事</marquee>
<br>-------------例6-母子标签------
<ul>
<li>无序列表1</li>
<li>无序列表2</li>
<li>无序列表3</li>
<li>无序列表4</li>
</ul>
<script>
function f(){
var text =document.getElementById('content').value;
var next_url = 'https://www.daidu.com/s?wd=' + text;
window.location.href = next_url;
console.log(text)
}
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
小节内容:
标签=元素
样式:
布局:
</body>
<a href="https://www.baidu.com">这是一个链接使用了 href 属性</a>
</html>
</head>
<body>
<div id="container" style="width:100%">
<div id="header" style="background-color:#FFA500;">
<h1 style="margin-bottom:0;">加油吧少年</h1>
</div>
<div id="menu" style="background-color:#FFD700;height:800px;width:10%;float:left;">
<b>菜单</b><br>
HTML<br>
CSS<br>
JavaScript<br>
爬虫<br>
</div>
<div id="content" style="background-color:#EEEEEE;height:800px;width:90%;float:left;">
内容就在这里</div>
<div id="footer" style="background-color:#FFA500;clear:both;text-align:center;">
Copyright © penglaixiaoke.com</div>
</div>
</body>
</html>
css基础
css 层叠样式表 或 级联样式表 。 定义如何显示HTML元素,用于控制web页面的外观。
通过使用 CSS 实现页面的内容与表现形式分离,极大提高了工作效率 。样式存储在样式表中,通常放在 <head>
部分或存储在 外部 CSS 文件中。作为网页标准化设计的趋势,CSS 取得了浏览器厂商的广泛支持,正越来越多的被应用到网页设计中去。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
div{
height: 50px;
width: 50px;
background-color: #FFA500;
/* 直接通过标签名来设置样式,会出现所有该标签都被设置为统一格式 */
/* 如果想给某个标签设置样式,可以通过添加属性id来解决 */
/* 如果想给某几个标签设置样式,可以通话添加属性class来解决 */
}
#one{
background-color: dodgerblue;
}
#two{
background-color: aquamarine;
}
.my{
width:100px;
}
#two{
background-color: fuchsia;
}
#menu{
background-color: #FFD700;
height: 800px;
width: 10%;
}
</style>
</head>
<body>
<div id="one"></div>
<br>
<div class="my"></div>
<br>
<div class="my"></div>
<br>
<div class="my"></div>
<br>
<div class="my"></div>
<br>
<div id="two"></div>
<div id="menu"></div>
</body>
</html>
JavaScript基础
JavaScript 是世界上最流行的脚本语言。 JavaScript 是属于 web 的语言,它适用于 PC、笔记本电脑、平板电脑和移动电话。 JavaScript 被设计为向 HTML 页面增加交互性。 许多 HTML 开发者都不是程序员,但是 JavaScript 却拥有非常简单的语法。几乎每个人都有能力将小的 JavaScript 片段添加到网页中。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>我的第一段 JavaScript</h1>
<p id="demo1">我的第一个段落。</p>
<button type="button"
onclick="document.getElementById('demo1').innerHTML = Date()">
点击我来显示日期和时间
</button>
<p>段落。</p>
<script>
document.write(Date());
</script>
<p id="demo2">我的第二个段落。</p>
<input type="button" onclick="f()" value="点我获取时间">
<script>
function f(){
document.getElementById("demo2").innerHTML=Date();
}
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
function myFunction(){
alert("你好,我是一个警告框!");
}
</script>
</head>
<body>
<input type="button" onclick="myFunction()" value="显示警告框" />
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
function startTime(){
var today=new Date();
var h=today.getHours();
var m=today.getMinutes();
var s=today.getSeconds();// 在小于10的数字钱前加一个‘0’
m=checkTime(m);
s=checkTime(s);
document.getElementById('txt').innerHTML=h+":"+m+":"+s;
t=setTimeout(function(){startTime()},500);
}
function checkTime(i){
if (i<10){
i="0" + i;
}
return i;
}
</script>
</head>
<body onload="startTime()">
<div id="txt"></div>
</body>
</html>
网页解析xpath
简介
XPath 是一门在 HTML / XML 文档中查找信息的语言
节点
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。
选取节点
xpath 使用路径表达在XML文档中选取节点。节点是通过沿着路径或者step 来选取的。
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取(取子节点)。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(取子孙节点)。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
路径表达式 | 结果 |
---|---|
bookstore | 选取 bookstore 元素的所有子节点。 |
/bookstore | 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径! |
bookstore/book | 选取属于 bookstore 的子元素的所有 book 元素。 |
//book | 选取所有 book 子元素,而不管它们在文档中的位置。 |
bookstore//book | 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。 |
//@lang | 选取名为 lang 的所有属性。 |
谓语
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
路径表达式 | 结果 |
---|---|
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素。 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素。 |
/bookstore/book[position()<3] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素。 |
//title[@lang='eng'] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]//title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |
选取未知节点
xpath 通配符可用来选取未知的XML元素。
通配符 | 描述 |
---|---|
* | 匹配任何元素节点。 |
@* | 匹配任何属性节点。 |
node() | 匹配任何类型的节点。 |
通配符 | 描述 |
---|---|
* | 匹配任何元素节点。 |
@* | 匹配任何属性节点。 |
node() | 匹配任何类型的节点。 |
选取若干路径
路径表达式 | 结果 |
---|---|
//book/title| //book/price | 选取 book 元素的所有 title 和 price 元素。 |
//title| //price | 选取文档中的所有 title 和 price 元素。 |
/bookstore/book/title| //price | 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素 |
例:
from lxml import etree
content = """
<div>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li class="con">1</li>
<li class="con">1</li>
<li class="con">1</li>
<a href="www.baidu.com">百度一下</a>
</ul>
</div>
html = etree.HTML(content) # etree.HIML 可以把字符串转为html文档
print(html) #<Element html at 0x2179a35e180>
# 锁定a元素
a = html.xpath('body/div/ul/a')
print(a)
# 锁定a元素 写法2
a = html.xpath('//a') # 直接写a 找不到,//a 不考虑节点位置
print(a)
# 锁定li
li_list = html.xpath('//li')
print(li_list)
# 添加简单条件
li_select_list = html.xpath('//li[@class="con"]')
print(li_select_list)
li_1 = html.xpath('//li[3]')
print(li_1)
# 所以的li
li_list = html.xpath('//li/text()') #获取li的内容
print(li_list)
# 条件检索
# 只找class=con的li
li_select_list = html.xpath('//li[@class="con"]/@class') # 获取class的属性值
print(li_select_list)
# 找第三个li
li_1 = html.xpath('//li[3]/text()') # 获取li的内容
print(li_1)