一、爬虫(Spider)
爬虫步骤
网页抓取,数据提取,数据存储
请求网站,提取网页内容的最大化程序。获取到的是html代码,需要从这些文本中提取需要的数据。
HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
SSL(Secure Sockets Layer 安全套接层)是为网络通信提供安全及数据完整性的一种安全协议。SSL在传输层对网络连接进行加密
公众平台接口不再支持http方式调用,在 2017年12月30日 后所有网站都必须是 HTTPS 方式调用
URL(统一资源定位符)基本格式:
scheme://host[:port#]/path/.../[?query-string][#anchor]
scheme:协议。如:http、https、ftp
host:服务器的IP地址or域名。如:192.168.0.11
port#:服务器的端口。(http默认端口为80,https默认端口为443)
path:访问资源的路径
query-string:参数,发送给http服务器的数据
anchor:锚(跳转到网页的指定铺点链接地址)
import urllib.request
def getHTML(url):
request_headers = {
'Host':'www.vmall.com',
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}
req = urllib.request.Request(url,headers=request_headers)
html = urllib.request.urlopen(req).read()
return html
def saveHTML(file_name, file_content):
# 注意windows文件命名的禁用符,比如 /
# with open(file_name.replace('/', '_') + ".html", "wb") as f:
with open(file_name+ ".html", "wb") as f:
# 写文件用bytes而不是str,所以要转码
f.write(file_content)
url = "https://www.vmall.com/list-111"
html = getHTML(url)
print (html)
print("网页已爬取")
saveHTML("baidu", html)
print("网页已存储至本地")
第一部分General是概要,包含请求地址,请求方式,状态码,服务器地址以及Referrer 策略。
第二部分是应答头部,是服务器返回的。
第三部分是请求头部,是客户端发送的
http响应头信息:
Content-Encoding:文档的编码信息
http请求头信息:
host:请求的资源服务器
user-agent:http客户端程序信息
accept:用户代理可请求的媒体类型
cache-control:控制缓存开关max-age=0,告诉服务器接收一个存在时间小于0s的资源
soup = BeautifulSoup(html,'html.parser')
得到了标签的内容用 .string 即可获取标签内部的文字:print soup.p.string
#!usr/bin/python
#-*- coding:utf-8 -*-
#createtime : 2019/8/19 22:10
#filename : test_html.py
#content : 爬取并保存到本地
import urllib.request
from bs4 import BeautifulSoup
def getHTML(url):
request_headers = {
'Host':'www.vmall.com',
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}
req = urllib.request.Request(url,headers=request_headers)
html = urllib.request.urlopen(req).read()
return html
def saveHTML(file_name, file_content):
# 注意windows文件命名的禁用符,比如 /
# with open(file_name.replace('/', '_') + ".html", "wb") as f:
with open(file_name+ ".html", "wb") as f:
# 写文件用bytes而不是str,所以要转码
f.write(file_content)
def getImg(html):
soup = BeautifulSoup(html,'html.parser')
divtag = soup.find_all("img")
length = len(divtag)
for i in range(length):
print(divtag[i].attrs["src"])
url = "https://www.vmall.com"
html = getHTML(url)
getImg(html)
# print (html)
print("网页已爬取")
# saveHTML("huawei", html)
print("网页已存储至本地")
# 导入urllib.request库
import
urllib.request
# 向指定的url发送请求,并返回服务器响应的类文件对象
response
=
urllib.request.urlopen(
"http://www.baidu.com/"
)
# 类文件对象支持 文件对象的操作方法,如read()方法读取文件全部内容,返回字符串
html
=
response.read()
# 打印字符串
print
(html)
可以设置另外两个参数:
1.data(默认为空):是伴随url提交的数据(比如post的数据),同时HTTP请求将从“GET”方式改为“POST”方式。
2.headers(默认为空):是一个字典
BeautifulSoup:
安装Beautiful Soup和lxml
lxml解析器有解析HTML和XML的功能,速度快,容错能力强
选择元素:
soup = BeautifulSoup(html,'html.parser')
print(soup.a.string)
print(soup.title)
print(type(soup.title))
print(soup.title.string)
print(soup.head)
方法选择器:
find_all(name , attrs , recursive , text , **kwargs)
print(soup.find_all(name='ul'))
for ul in soup.find_all(name='ul'):
print(ul.find_all(name='li'))
for li in ul.find_all(name='li'):
print(li.string)
print(soup.find_all(text=re.compile('qq')))
find()方法,返回的是单个元素,也就是第一个匹配的元素
CSS选择器:
print(soup.select('.button-top-banner-min'))
soup.a.parent就可以获取父节点的信息
print(soup.a.parent)
print(soup.find('a',{'class': 'button-top-banner-min'}).parent)
子节点
print(soup.li.contents)
兄弟节点
soup.a.next_siblings 获取后面的兄弟节点
soup.a.previous_siblings 获取前面的兄弟节点
soup.a.next_sibling 获取下一个兄弟标签
souo.a.previous_sinbling 获取上一个兄弟标签