1.什么是互联网爬虫?

Untitled

如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的数据

解释1:通过一个程序,根据Url(http://www.taobao.com)进行爬取网页,获取有用信息 解释2:使用程序模拟浏览器,去向服务器发送请求,获取响应信息

2.爬虫核心?

  1. 爬取网页:爬取整个网页 包含了网页中所有得内容
  2. 解析数据:将网页中你得到的数据 进行解析
  3. 难点:爬虫和反爬虫之间的博弈

3.爬虫的用途?

Untitled

4.爬虫分类?

通用爬虫:

实例

百度、360、google、sougou等搜索引擎‐‐‐伯乐在线

功能

访问网页‐>抓取数据‐>数据存储‐>数据处理‐>提供检索服务

robots协议

一个约定俗成的协议,添加robots.txt文件,来说明本网站哪些内容不可以被抓取,起不到限制作用自己写的爬虫无需遵守

网站排名(SEO)

  1. 根据pagerank算法值进行排名(参考个网站流量、点击率等指标)
  2. 百度竞价排名

缺点

1. 抓取的数据大多是无用的

2.不能根据用户的需求来精准获取数据

聚焦爬虫

功能

根据需求,实现爬虫程序,抓取需要的数据

设计思路

1.确定要爬取的url

如何获取Url

2.模拟浏览器通过http协议访问url,获取服务器返回的html代码

如何访问

3.解析html字符串(根据一定规则提取需要的数据)

如何解析

5.反爬手段?

1.User‐Agent:User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

2.代理IP

西次代理

快代理

什么是高匿名、匿名和透明代理?它们有什么区别?

1.使用透明代理,对方服务器可以知道你使用了代理,并且也知道你的真实IP。

2.使用匿名代理,对方服务器可以知道你使用了代理,但不知道你的真实IP。

3.使用高匿名代理,对方服务器不知道你使用了代理,更不知道你的真实IP。

3.验证码访问

打码平台

云打码平台

超级🦅

4.动态加载网页 网站返回的是js数据 并不是网页的真实数据

selenium驱动真实的浏览器发送请求

5.数据加密

分析js代码

6.urllib库使用

模拟浏览器向服务器发送请求

urllib.request.urlopen()

response 服务器返回的数据

response的数据类型是HttpResponse

字节‐‐>字符串

解码decode字符串‐‐>字节

编码encode

# 使用urllib来获取百度首页的源码
import urllib.request

# (1)定义一个url  就是你要访问的地址
url = '<http://www.baidu.com>'

# (2)模拟浏览器向服务器发送请求 response响应
response = urllib.request.urlopen(url)

# (3)获取响应中的页面的源码  content 内容的意思
# read方法  返回的是字节形式的二进制数据
# 我们要将二进制的数据转换为字符串
# 二进制--》字符串  解码  decode('编码的格式')
content = response.read().decode('utf-8')

# (4)打印数据
print(content)

六个方法 read readline readlines getcode geturl getheaders

read() 字节形式读取二进制 扩展:rede(5)返回前几个字节

readline() 读 取 一 行

readlines() 一行一行读取 直至结束

getcode() 获 取 状 态 码

geturl() 获 取 url

getheaders() 获取headers

import urllib.request

url = '<http://www.baidu.com>'

# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(url)

# 一个类型和六个方法
response是HTTPResponse的类型
print(type(response))

# 按照一个字节一个字节的去读
content = response.read()
print(content)

# 返回多少个字节
content = response.read(5)
print(content)

# 读取一行
content = response.readline()
print(content)

content = response.readlines()
print(content)

# 返回状态码  如果是200了 那么就证明我们的逻辑没有错
print(response.getcode())

# 返回的是url地址
print(response.geturl())

# 获取是一个状态信息
print(response.getheaders())

# 一个类型 HTTPResponse
# 六个方法 read  readline  readlines  getcode geturl getheaders

下载

urllib.request.urlretrieve():请求网页/ 请求图片/ 请求视频

import urllib.request

# 下载网页
url_page = '<http://www.baidu.com>'

# url代表的是下载的路径  filename文件的名字
# 在python中 可以变量的名字  也可以直接写值
urllib.request.urlretrieve(url_page,'baidu.html')

# 下载图片
url_img = '<https://img1.baidu.com/it/u=3004965690,4089234593&fm=26&fmt=auto&gp=0.jpg>'
#
urllib.request.urlretrieve(url= url_img,filename='lisa.jpg')

# 下载视频
url_video = '<https://vd3.bdstatic.com/mda-mhkku4ndaka5etk3/1080p/cae_h264/1629557146541497769/mda-mhkku4ndaka5etk3.mp4?v_from_s=hkapp-haokan-tucheng&auth_key=1629687514-0-0-7ed57ed7d1168bb1f06d18a4ea214300&bcevod_channel=searchbox_feed&pd=1&pt=3&abtest=>'

urllib.request.urlretrieve(url_video,'hxekyyds.mp4')

7.请求对象的定制

UA介绍:User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本。浏览器内核、浏览器渲染引擎、浏览器语言、浏览器插件等

语法:request = urllib.request.Request()

扩展:编码的由来

import urllib.request

url = '<https://www.baidu.com>'

# url的组成
# <https://www.baidu.com/s?wd=周杰伦>

# http/https    www.baidu.com   80/443     s      wd = 周杰伦     #
#    协议             主机        端口号     路径     参数           锚点
# http   80
# https  443
# mysql  3306
# oracle 1521
# redis  6379
# mongodb 27017

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}

# 因为urlopen方法中不能存储字典 所以headers不能传递进去
# 请求对象的定制
request = urllib.request.Request(url=url,headers=headers)

response = urllib.request.urlopen(request)

content = response.read().decode('utf8')

print(content)

8.编解码

编码集的演变 由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。 你可以想得到的是,全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc‐kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。 因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。 Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。'''

# <https://www.baidu.com/s?wd=%E5%91%A8%E6%9D%B0%E4%BC%A6>

# 需求 获取 <https://www.baidu.com/s?wd=周杰伦的网页源码>

import urllib.request
import urllib.parse

url = '<https://www.baidu.com/s?wd=>'

# 请求对象的定制为了解决反爬的第一种手段
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}

# 将周杰伦三个字变成unicode编码的格式
# 我们需要依赖于urllib.parse
name = urllib.parse.quote('周杰伦')

url = url + name

# 请求对象的定制
request = urllib.request.Request(url=url,headers=headers)

# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)

# 获取响应的内容
content = response.read().decode('utf-8')

# 打印数据
print(content)

8.1. get请求方式:urllib.parse.quote()

将汉字变成对应的Unicode编码