通用网络爬虫 是 捜索引擎抓取系统(Baidu、Google、Yahoo等)的重要组成部分。主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。
通用网络爬虫 从互联网中搜集网页,采集信息,这些网页信息用于为搜索引擎建立索引从而提供支持,它决定着 整个引擎系统的内容是否丰富,信息是否即时,因此其性能的优劣直接影响着搜索引擎的效果。
搜索引擎如何获取一个新网站的URL:
1.新网站向搜索引擎主动提交网址:
2.在其他网站上设置新网站外链
3.和DNS解析服务商(如DNSPod等)合作,新网站域名将被迅速抓取。
搜索引擎蜘蛛的爬行是被输入了一定的规则的,它需要遵从一些命令或文件的内容。
聚焦爬虫,是"面向特定主题需求"的一种网络爬虫程序,它与通用搜索引擎爬虫的区别在于:聚焦爬虫在实施网页 抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息。
我们后期要学习的就是聚焦爬虫
HTTP协议-80端口
HyperTextTransferProtocol, 超文本传输协议是一种发布和接收HTML页面的方法。
HTTPS-443端口
HypertextTransferProtocoloverSecureSocketLayer, 简单讲是HTTP的安全版,在HTTP下加入SSL 层。
URL(Uniform/UniversalResourceLocator的缩写):统一资源定位符,是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。
基本格式: scheme://host[:port#]/path/…/[?query-string][#anchor]
query-string:参数,发送给http服务器的数据
http://www.baidu.com?wd=python
anchor:锚(跳转到网页的指定锚点位置)
客户端发送一个HTTP请求到服务器的请求消息,包括以下格式:
根据HTTP标准,HTTP请求可以使用多种请求方法.
Host: 主机和端口号
Connection : 客户端与服务连接类型, 默认为keep-alive
User-Agent: 客户浏览器的名称
Accept: 浏览器或其他客户端可以接受的MIME文件类型
Referer:表明产生请求的网页来自于哪个URL
Accept-Encoding:指出浏览器可以接受的编码方式。
Accept-Language:语言种类
Accept-Charset: 字符编码
Cookie:浏览器用这个属性向服务器发送Cookie
Content-Type:POST请求里用来表示的内容类型。
HTTP响应由四个部分组成,分别是: 状态行 、 消息报头 、 空行 、 响应正文
200: 请求成功
302: 请求页面临时转移至新url
307和304: 使用缓存资源
404: 服务器无法找到请求页面
403: 服务器拒绝访问,权限不够
500: 服务器遇到不可预知的情况
服务器和客户端的交互仅限于请求/响应过程,结束之后便断开,在下一次请求时,服务器会认为新的客户端。为了维护他们之间的链接,让服务器知道这是前一个用户发送的请求,必须在一个地方保存客户端的信息。
需求分析:
"我想要图片,我又不想上网搜“
“最好还能自动下载”
……
这就是需求,至少要实现两个功能,一是搜索图片,二是自动下载。
编写正则表达式解析代码:
pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
编写爬虫代码:
# encoding=utf-8
"""
Date:2019-08-07 10:33
User:LiYu
Email:[email protected]
"""
import os
import re
import requests
imgDir = 'pictures'
def downloadPic(html, keyword):
headers = {
'User-Agent': "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
}
pic_url = re.findall('"objURL":"(.*?)",', html, re.S)
if not pic_url:
print('没有找到关键词:' + keyword + ' 的图片...')
else:
count = 0
print("找到关键词:" + keyword + " 的图片, 现在开始下载图片...")
for i in pic_url:
# 下载五张
if count >= 5:
break
# 目录不存在则先创建
if not os.path.exists(imgDir):
print('正在创建目录:', imgDir)
os.makedirs(imgDir)
# 图片重命名和目录拼接
name = keyword + '_' + str(count) + '.' + i.split('.')[-1]
filename = os.path.join(imgDir, name)
# 下载图片
print('正在下载第 ' + str(count + 1) + ' 张图片', '图片地址:' + str(i))
try:
response = requests.get(i, headers=headers)
except Exception as e:
print('[错误]', e)
count -= 1
continue
# 保存图片
with open(filename, 'wb') as f:
f.write(response.content)
count += 1
if __name__ == '__main__':
keyword = input('请输入你要下载的图片关键字:')
url = 'http://image.baidu.com/search/index?tn=baiduimage&ie=utf-8&word=' + keyword
try:
result = requests.get(url)
except Exception as e:
html = ''
print('[错误]', e)
else:
html = result.text
downloadPic(html, keyword)