python_爬虫

Urllib

1.什么是互联网爬虫?

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

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

2.爬虫核心

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

3.爬虫的用途

·数据分析/人工数据集 ​ ·社交软件冷启动 ​ ·舆情监控 ​ ·竞争对手监控

4.爬虫分类

通用爬虫:
   实例
       百度、360、google、sougou等搜索引擎---伯乐在线
   功能
访问网页->抓取数据->数据存储->数据处理->提供检索服务
robots协议
一个约定俗成的协议,添加robots.txt文件,来说明本网站哪些内容不可以被抓取,起不到限制作用自己写的爬虫无需遵守
网站排名(SEO)
       1.根据pagerank算法值进行排名(参考个网站流量、点击率等指标)
       2.百度竞价排名
   缺点
       1. 抓取的数据大多是无用的
       2.不能根据用户的需求来精准获取数据
聚焦爬虫
功能
根据需求,实现爬虫程序,抓取需要的数据
设计思路
       1.确定要爬取的url
      如何获取url
       2.模拟浏览器通过http协议访问url,获取服务器返回的html代码
      如何访问
       3.解析htm1字符串(根据一定规则提取需要的数据)
      如何解析

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
   read()       字节形式读取二进制   扩展:rede(5)返回前几个字节
   readline()   读取一行
   readlines()  一行一行读取 直至结束
   getcode()    获取状态码
   geturl()     获取url
   getheaders() 获取headers
urllib.request.urlretrieve()
   请求网页
   请求图片
   请求视频

7.请求对象的定制

requests模块

  --ullib模块
 --requests模块
requests模块 requests模块:python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高。
作用:模拟浏览器发请求。
如何使用: (resqursts模块的编码流程)
•      -- 指定url
•      -- 发起请求
•      -- 获取响应数据
•      -- 持久化存储
环境安装:
​ pip install requests
实在编码:
​ 需求:爬取搜狗首页的页面数据
实战巩固
​ 需求:爬取搜狗指定词条对应的搜索结果页面(简易网页采集器)
​ 需求:破解百度翻译
​ 需求:爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影 详情数据
​ 需求:爬取肯德基餐厅查询http://www.kfc.com.cn/kfccda/index.aspx中指定地点的餐厅数量
​ 需求:爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据
UA介绍:User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本。浏览器内核、浏览器渲染引擎、浏览器语言、浏览器插件等
语法: request = urllib.request.Request()

扩展:编码的由来

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

8.编解码

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

eg:

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/99.0.4844.51 Safari/537.36 Edg/99.0.1150.36'
}

# 将IU三个字变成unicode编码格式
# 我们需要依赖于urllib.parse
name = urllib.parse.quote('IU')
# print(name) # 输出%E5%91%A8%E6%9D%B0%E4%BC%A6
url = url + name
# print(url) # 输出https://www.baidu.com/s?wd=%E5%91%A8%E6%9D%B0%E4%BC%A6

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

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

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

# 打印数据
print(content)

2. get请求方式:urllib.parse.unlencode()

eg:

import urllib.request
import urllib.parse

base_url = 'https://www.baidu.com/s?'

data = {
'wd': 'IU',
'sex': '女',
'location': '韩国'
}
new_data = urllib.parse.urlencode(data)

# 请求资源路径
url = base_url + new_data

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

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

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

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

# 打印
print(content)

3. post请求方式

eg:百度翻译
import urllib.request
import urllib.parse
url = 'https://fanyi.baidu.com/sug'

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

data = {
'kw': 'spider' # 蜘蛛
}

# post请求的参数 必须要进行编码
data = urllib.parse.urlencode(data).encode('utf-8')

# 请求对象的定制 是不会拼接在url的后面的 而是需要放在请求对象定制的参数中
# post请求的参数 必须要进行编码
request = urllib.request.Request(url=url, data=data, headers=headers)

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

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

# 字符串--》 json对象
import json
obj = json.loads(content)
print(obj)

# post请求的参数 必须要进行编码 data = urllib.parse.urlencode(data)
# 编码之后 必须调用encode方法 data = urllib.parse.urlencode(data).encode('utf-8')
# 参数是放在请求对象定制方法中 request = urllib.request.Request(url=url, data=data, headers=headers)

9. ajax的get请求

案列:豆瓣电影


# https://movie.douban.com/j/chart/top_list?type=16&interval_id=100:90&action=&
# start=0&limit=20
# https://movie.douban.com/j/chart/top_list?type=16&interval_id=100:90&action=&
# start=20&limit=20
# https://movie.douban.com/j/chart/top_list?type=16&interval_id=100:90&action=&
# start=40&limit=20
# https://movie.douban.com/j/chart/top_list?type=16&interval_id=100:90&action=&
# start=60&limit=20

# page 1 2 3 4
# start 0 20 40 60

# start (page-1)*20

# 下载豆瓣电影前10页的数据
# (1)请求对象的定制
# (2)获取响应的数据
# (3)下载数据

import urllib.parse
import urllib.request

def create_request(page):
base_url = 'https://movie.douban.com/j/chart/top_list?type=16&interval_id=100:90&action=&'

data = {
'start': (page-1)*20,
'limit': 20
}

data = urllib.parse.urlencode(data)

url = base_url + data
print(url)

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

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

def get_content():
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
return content

def dow_load(page,content):
# with open(文件的名字,模式,编码) as fp:
# fp。write(内容)
with open('douban_'+str(page)+'.json', 'w', encoding='utf-8') as fp:
fp.write(content)


# 程序的入口
if __name__ == '__main__':
start_page = int(input('请输入起始的页面:'))
end_page = int(input('请输入结束的页面:'))

for page in range(start_page, end_page+1):
# 每一页都有自己的请求对象的定制
request = create_request(page)
# 获取响应的数据
get_content(request)
# 下载
down_load(pase,content)

10. ajax的post请求

案例:KFC官网

# coding=gbk

# 第1页
# http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname
# post
# cname: 北京
# pid:
# pageIndex: 1
# pageSize: 10

# 第2页
# http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname
# post
# cname: 北京
# pid:
# pageIndex: 2
# pageSize: 10

import urllib.request
import urllib.parse

# base_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'

def create_request(page):
base_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'

data = {
'cname': '北京',
'pid': '',
'pageIndex': page,
'pageSize': '10'
}

data = urllib.parse.urlencode(data).encode('utf-8')

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

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

def get_content(request):
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
return content

def down_load(page,content):
with open('kfc_' + str(page) + '.json', 'w', encoding='utf-8') as fp:
fp.write(content)

if __name__ == '__main__':
start_page = int(input('请输入起始页码:'))
end_page = int(input('请输入结束页码:'))

for page in range(start_page, end_page+1):
# 请求对象定制
request = create_request(page)
# 获取网页源码
content = get_content(request)
# 下载
down_load(page, content)

11.URLError\HTTPError

简介:1 IHTTPError类是URLError类的子类
2.导入的包urllib.error.HTTPError urllib.error.URLError
3.http错误:http错误是针对浏览器无法连接到服务器而增加出来的错误提示。引导并告诉浏览者该页
是哪里出了问题。
4.通过urllib发送请求的时候,有可能会发送失败,这个时候如果想让你的代码更加的健壮,可以通过try-except进行捕获异常,异常有两类,URLError\HTTPError
eg:

# coding=gbk

import urllib.request
import urllib.error

# url = 'https://blog.csdn.net/qq_42539533/article/details/889024291'

url = 'http://www.doudan111.com'

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

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

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

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

print(content)
except urllib.error.HTTPError:
print('系统正在升级。。。')
except urllib.error.URLError:
print('我都说了,系统正在升级。。。')

12. cookie登录

Cookie:

指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)

cookie记录了包括登录状态在内的所有信息,这些信息由服务器生成和解释,服务器通过客户端携带的cookie来识别用户。
cookie的用途

(1)登录信息:判断用户是否已经登录

登录时,我们经常会有保存密码这个选项,但是你如果选择了保存密码这个选项,实际上是浏览器会把这些cookies写 到文件系统里面,那下次凭着这个cookie就可以自动登录上去了。

(2)购物车:保存用户购买的商品列表

我们经常上一些购物网站的时候,即使我们没有登录,我们也可以把商品加到购物车里面。

那这个购物车是保存在哪里的呢?

实际上就是保存在cookie里面,就是服务器把这个购物的信息、商品的信息通过cookie的形式保存在客户端,然后再 把这个cookie发过去,那么服务器就会知道你的客户端到底保存了什么信息。

使用案例: weibo登陆

13. Handler处理器

为什么要学习handler?
urllib.request.urlopen(url)
不能定制请求头
urllib.request.Request(url,headers,data)
可以定制请求头
Handler
定制更高级的请求头(随着业务逻辑的复杂 请求对象的定制已经满足不了我们的需求(动态cookie和代理不能使用请求对象的定制)

 

posted @   ~Tang  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示