目录
1.爬虫简介
2.爬虫的合法性探究
3.爬虫的初始探入
4.BeautifulSoup库
5.requests模块
5.1 实战:爬取搜狗首页的页面数据
5.2 实战之网页采集器
5.2.1 UA伪装
5.2.2 实战代码
5.3 实战之破解百度翻译
5.4 爬取豆瓣高分电影分类排行榜
什么是爬虫?
——指通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程。
爬虫有什么价值?
总的来说爬虫的价值就是:实际应用、就业
爬虫究竟合法还是违法?
——在法律上不被禁止
——具有违法风险
——善意爬虫 恶意爬虫:抢票
带来的风险:
——爬虫干扰了被访问网站的正常运营
——爬虫抓取了受到被法律保护的特定类型的数据或信息
如何在使用编写爬虫的过程中避免进入局子的厄运呢?
——时常优化自己的程序,避免干扰被访问网站的正常运行
——在使用传播爬取到的数据时,审查抓取到的内容,如果发现了涉及到用户隐私商业机密等敏感内容,需要即时停止爬取或传播
爬虫在使用场景中的分类
——通用爬虫:
抓取系统的重要组成部分。抓取的是一整张页面数据
——聚焦爬虫:
建立在通用爬虫的基础上。抓取的是页面中特定的局部内容。
——增量式爬虫:
监测网站中数据更新的情况。只会抓取网站中最新更新出来的数据。
爬虫的矛与盾:
反爬机制:
相关门户网站,可以通过制定相应的策略或技术手段,防止爬虫程序进行网站数据的爬取。
反反爬机制:
爬虫程序可以通过制定相关策略或技术手段,破解门户网站具备的反爬机制,从而可以获取门户网站的信息。
robots.txt协议:
君子协议。规定了网站中哪些数据可以被爬虫爬取哪些不能被爬取。
Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据。详细不过多介绍了
html基本格式:
This is a python demo page
The demo python introduces several python courses.
Python is a wonderful general‐purpose programming language.
You can learn Python from novice to professional by tracking the following courses:
Basic Python and
Advanced Python.
<>…>构成了所属关系
——urllib模块:古老
——requests模块:简洁高效
什么是requests模块?
python中原生的一款基于网络请求的模块,功能强大,效率极高
作用:模拟浏览器发请求。
如何使用:(requests模块的编码流程)
——指定url
——发起请求
——获取响应数据
——持久化存储
环境安装:
pip install requests
import requests
if __name__ == '__main__':
# 指定url
url = 'http://www.sogou.com/'
# 发起请求
# get方法返回一个响应对象
response = requests.get(url=url)
# 获取响应数据:text返回的是字符串形式的响应数据:
page_text = response.text
print(page_text)
# 持久化存储
with open('./sogou.html','w',encoding='utf-8') as fp:
fp.write(page_text)
print('爬取数据结束')
UA伪装:让爬对应的请求载体身份标识伪装成某一浏览器
UA:User-Agent(请求载体的身份标识)
1 直接访问 ip地址查询
2.浏览器直接console输入 alert(navigator.userAgent)
门户网站的服务器会检测对应请求的载体身份标识,如果检测到请求的载体身份标识为某一浏览器,则说明是一正常请求,但请求的载体身份标识不是基于某一款浏览器的,则这一请求是不正常的请求(爬虫),服务器端可能会拒绝该次请求。所以要进行UA伪装
import requests
if __name__ == '__main__':
# UA伪装:将对应的User—Agent封装到一个字典中
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53'
}
url = 'https://cn.bing.com/search?'
# 处理url携带的参数:封装到字典中
kw = input('enter a word')
param = {
'q': kw
}
# 对指定的url发起的请求对应的url是带参数的,并且请求过程中处理了参数
response = requests.get(url=url, params=param, headers=headers)
page_text = response.text
fileName = kw+'.html'
with open(fileName, 'w', encoding='utf-8') as fp:
fp.write(page_text)
print('保存成功')
找阿贾克斯(ajax)请求
——对应的请求是post请求,携带了参数
——响应数据是一组json数据
import requests
import json
if __name__ == '__main__':
# 指定URL
post_url = 'https://fanyi.baidu.com/sug'
# 进行UA伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53'
}
# post请求参数处理,同get请求一致
word = input('enter a word:')
data = {
'kw': word
}
# 请求发送
response = requests.post(url=post_url, data=data, headers=headers)
# 获取相应数据json() 返回的是一个字典对象(如果确认响应数据是json类型才使用json)
dic_obj = response.json()
# 持久化存储
fileName = word+'.json'
fp = open(fileName, 'w', encoding='utf-8')
#中文不能使用ascii编码
json.dump(dic_obj,fp=fp, ensure_ascii=False)
滑动页面时会产生一个get请求
import requests
import json
if __name__ == '__main__':
url = 'https://movie.douban.com/j/chart/top_list'
param = {
'type': '24',
'interval_id': '100:90',
'action': '',
'start': '0', # 从库中第几部电影取
'limit': '20' # 一次取出的个数
}
# 进行UA伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53'
}
response = requests.get(url=url, params=param, headers=headers)
list_data = response.json()
fp = open('./douban.json', 'w', encoding='utf-8')
json.dump(list_data, fp=fp, ensure_ascii=False)
print('over')
注:获取json后可以复制去在线json格式化网站查看json