网页组成
一般后缀为.html
HTML: HyperText Markup Language 超文本标记语言
CSS: Cascading Style Sheet 层叠样式表
JS: JavaScript
HTML 负责定义网页的内容;HTML 是网页的基本结构
CSS 负责描述网页的布局;描述网页的表现形式(例如网页元素的位置、大小、颜色等)
JavaScript 负责网页的行为
HTML
由<>包围的特殊标记,这叫做 HTML 标签(Tag);成对出现得;最后<head>…</head>都会加个/
<!DOCTYPE html> 声明为 HTML5 文档
<html>..</html> 是网页的根元素
<head>..</head> 元素包含了文档的元(meta)数据,如 <meta charset="utf-8"> 定义网页编码格式为 utf-8。
<title>..<title> 元素描述了文档的标题;网页标题会显示在浏览器的标签栏
<body>..</body> 表示用户可见的内容
<div>..</div> 表示框架
<p>..</p> 表示段落
<ul>..</ul> 定义无序列表
<ol>..</ol>定义有序列表
<li>..</li>表示列表项
<img src="" alt="">表示图片
<h1>..</h1>表示标题
<a href="">..</a>表示超链接
<a href="http://c.biancheng.net/html/" target="_blank">HTML教程(新窗口打开)</a>
<a href="http://c.biancheng.net/css3/">CSS教程(当前窗口打开)</a>
<img> 标签表示一张图片;
<table> 标签表示一个表格;
<input> 标签表示一个输入框;
<p> 标签表示一段文本;
<strong> 标签表示文本加粗效果;
<div> 标签表示块级布局
<h1>这是一个一级标题</h1>
<h2>这是一个二级标题</h2>
<h3>这是一个三级标题</h3>
<input type="text" /> :用来定义一个输入框
<b>编程</b> : 加粗
<small>小号字体</small>
<h1>到<h6>六个级别的标题标签
换行标签<br /> 不需要结束符如:<p>C语言中文网<br />http://c.biancheng.net/html/<br />HTML教程</p>; 分成三行
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>这是网页标题--个人</title>
</head>
<body>
<p>这是一段文本</p>
<a href="https://mp.csdn.net/mp_blog/creation/success/124440121">这个一个超链接</a>
<ul>
<li>条目1</li>
<li>条目2</li>
<li>条目3</li>
</ul>
</body>
</html>
CSS
CSS 的主要作用是定义网页的样式(美化网页),对网页中元素的位置、字体、颜色、背景等属性进行精确控制。CSS 不仅可以静态地修饰网页,还可以配合 JavaScript 动态地修改网页中元素的样式。
/*单行注释*/
/*
多行注释
*/
CSS 样式规则由三个部分组成,分别是选择器、属性和值。
选择器 h1 表示要为网页中所有的<h1>标签定义样式;
属性 color 表示字体颜色,值 blue 则表示将字体设置为蓝色;
属性 text-align 表示文本的对齐方式,值 center 则表示将文本的对齐方式设置为居中对齐
注释代码:使用/* */将这段代码注释起来:/*color: red;*/
标签选择器
h1 {
color: blue;
text-align: center;
}
设置CSS样式:
标签–内嵌样式
<head>
<title>编程帮</title>
<style>
/* 为所有 h1 标签设置 CSS 样式 */
h1 {
color: blue; /*设置字体颜色为蓝色*/
text-align: center; /*设置对齐方式为居中对齐*/
}
/* 为所有 p 标签设置 CSS 样式 */
p {
color: red; /*设置字体颜色为红色*/
font-size: 18px; /*设置字体大小为 18 像素*/
}
</style>
</head>
内联样式
<body>
<h1 style="color: maroon; margin-left: 40px">编程帮</h1>
<p style="color: blue;">http://www.biancheng.net/</p>
</body>
爬虫
http://www.biancheng.net/index?param=10
路径和查询字符串之间使用问号?隔开。上述示例的域名为 www.biancheng.net,路径为 index,查询字符串为 param=10
冒号:用于分隔协议和主机组件,斜杠用于分隔主机和路径
?:用于分隔路径和查询参数等。
=用于表示查询参数中的键值对。
&符号用于分隔查询多个键值对。
#windows会存在乱码问题,需要使用 gbk解码,并使用ignore忽略不能处理的字节
#linux不会存在上述问题,可以直接使用decode('utf-8')解码
html=res.read().decode("gbk","ignore")
# -*- coding:utf-8 -*-
from urllib import request
response=request.urlopen('https://www.maoyan.com/board')
print(response)
#提取响应内容
##通过调用 response 响应对象的 read() 方法提取 HTML 信息,该方法返回的结果是字节串类型(bytes),因此需要使用 decode() 转换为字符串
html = response.read().decode('utf-8')
#打印响应内容
print(html)
urlopen()
urllib.request.urlopen(url,timeout) ##向url发起请求;返回的是字节类型
urlopen() 有两个参数,说明如下:
url:表示要爬取数据的 url 地址。
timeout:设置等待超时时间,指定时间内未得到响应则抛出超时异常。
Request()
创建请求对象、包装请求头,比如重构 User-Agent(即用户代理,指用户使用的浏览器)使程序更像人类的请求。
urllib.request.Request(url,headers)
参数说明如下:
url:请求的URL地址。
headers:重构请求头。
response=request.urlopen('https://www.maoyan.com/board')
url = response.geturl() # 返回响应对象的URL地址 也就是上面网址
print(url)
User-Agent 即用户代理,简称“UA”,它是一个特殊字符串头;网站服务器通过识别 “UA”来确定用户所使用的操作系统版本、CPU 类型、浏览器版本等信息。而网站服务器则通过判断 UA 来给客户端发送不同的页面。
避免网站通过识别 User-Agent 来封杀爬虫程序。
模块随机获取UA: fake-useragent
pip install fake-useragent
from fake_useragent import UserAgent
#实例化一个对象
ua=UserAgent()
#随机获取一个ie浏览器ua
print(ua.ie)
#随机获取一个火狐浏览器ua
print(ua.firefox)
from urllib import request
# 定义变量:URL 与 headers
url = 'http://httpbin.org/get' #向测试网站发送请求
#重构请求头,伪装成 Windows Chrome浏览器访问
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'}
# 1、创建请求对象,包装ua信息
req = request.Request(url=url,headers=headers)
# 2、发送请求,获取响应对象
res = request.urlopen(req)
# 3、提取响应内容
html = res.read().decode('utf-8')
print(html)
urllib.parse
对搜索内容如汉字,会进行编码
urlencode() 该方法实现了对 url 地址的编码操作
unquote() 该方法将编码后的 url 地址进行还原,被称为解码
#导入parse模块
from urllib import parse
#构建查询字符串字典
query_string = {
'wd' : '爬虫'
}
#调用parse模块的urlencode()进行编码
result = parse.urlencode(query_string) ##先进行编码再爬虫
result= parse.quote(query_string ) # 或者使用quote(),只能对字符串进行编码
#使用format函数格式化字符串,拼接url地址
url = 'http://www.baidu.com/s?{}'.format(result)
print(url)
URL拼接:
# 1、字符串相加
baseurl = 'http://www.baidu.com/s?'
params='wd=%E7%88%AC%E8%99%AB'
url = baseurl + params
# 2、字符串格式化(占位符)
params='wd=%E7%88%AC%E8%99%AB'
url = 'http://www.baidu.com/s?%s'% params
# 3、format()方法
url = 'http://www.baidu.com/s?{}'
params='wd=%E7%88%AC%E8%99%AB'
url = url.format(params)
#每爬取一个页面随机休眠1-2秒钟的时间
time.sleep(random.randint(1,2))
模板
找URL的规律
https://tieba.baidu.com/f?kw=%E9%99%95%E8%A5%BF%E7%A7%91%E6%8A%80%E5%A4%A7%E5%AD%A6&ie=utf-8&pn=0
https://tieba.baidu.com/f?kw=%E9%99%95%E8%A5%BF%E7%A7%91%E6%8A%80%E5%A4%A7%E5%AD%A6&ie=utf-8&pn=50
发现 url 具有两个查询参数,分别是 kw 和 pn,并且 pn 参数具有规律性,如下所示:
第n页:pn=(n-1)*50
#参数params
pn=(page-1)*50
params={
'kw':name,
'pn':str(pn)
}
https://tieba.baidu.com/f?kw=陕西科技大学&ie=utf-8&pn=50
# 程序结构
class xxxSpider(object):
def __init__(self):
# 定义常用变量,比如url或计数变量等
def get_html(self):
# 获取响应内容函数,使用随机User-Agent
def parse_html(self):
# 使用正则表达式来解析页面,提取数据
def write_html(self):
# 将提取的数据按要求保存,csv、MySQL数据库等
def run(self):
# 主函数,用来控制整体逻辑
if __name__ == '__main__':
# 程序开始运行时间
spider = xxxSpider()
spider.run()
####示例
# -*- coding:utf-8 -*-
import time
from urllib import request,parse
from fake_useragent import UserAgent
class TieBarSpider:
def __init__(self,url,file_name):
self.url = url
self.file_name = file_name
# 1.保存文件函数
def save_html(self,html):
with open(file_name,'w',encoding='utf-8') as f:
f.write(html)
def run(self):
pn = 100
query_string = {
'wd': '陕西科技大学',
'ie':'utf-8',
'pn': '0'
}
# 拼接URL地址
params = parse.urlencode(query_string)
Whole_url = self.url.format(params)
req = request.Request(url=Whole_url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'})
res = request.urlopen(req)
# windows会存在乱码问题,需要使用 gbk解码,并使用ignore忽略不能处理的字节;也可也用utf-8试一试
# linux不会存在上述问题,可以直接使用decode('utf-8')解码
html = res.read().decode('utf-8', "ignore")
self.save_html(html)
if __name__ == '__main__':
start_time = time.time()
url = 'http://tieba.baidu.com/f?{}'
file_name= '陕西科技大学' + '.html'
spider = TieBarSpider(url,file_name)
spider.run()
end_time = time.time()
print('执行时间:%.2f'%(end_time-start_time))
#######
# 以脚本方式启动
if __name__ == '__main__':
#捕捉异常错误
try:
spider = MaoyanSpider()
spider.run()
except Exception as e:
print("错误:",e)