爬虫Ⅰ:爬虫的基础知识
爬虫的基础知识使用实例、应用技巧、基本知识点总结和需要注意事项
爬虫初始:
爬虫:
+ Request
+ Scrapy
数据分析+机器学习
+ numpy,pandas,matplotlib
jupyter:
+ 启动:到你需要进去的文件夹,然后输入jupyter notebook
cell是分为不同模式的:(Code:编写代码、markdown:编写笔记)
jupyter的快捷键:
添加cell: a, b (a向前添加,b先后添加)
删除cell: x
执行:shift+enter(执行并且光标到下一行),ctrl+enter(执行并且光标仍然在这一行)
tab:自动补全切换cell的模式:
- m :makedown模式
- y:代码模式
打开帮助文档:shift + tab
爬虫简介(了解):
1、什么是爬虫?
通过编写程序模拟浏览器上网,然后让其去互联网上爬取数据的过程
2、爬虫的分类:
通用爬虫:抓取互联网中的一整张页面数据
聚焦爬虫:抓取页面中的局部数据
增量式爬虫:用来监测网站数据更新的情况,以便爬取到网站最新更新出来的数据
3、反爬机制
4、反反爬策略
5、爬虫合法吗?
5.1爬取数据的行为风险的体现:
爬虫干扰了被访问网站的正常运营;
爬虫抓取了受到法律保护的特定类型的数据或信息。
5.2规避风险:
严格遵守网站设置的robots协议;
在规避反爬虫措施的同时,需要优化自己的代码,避免干扰被访问网站的正常运行;
在使用、传播抓取到的信息时,应审查所抓取的内容,如发现属于用户的个人信息、隐私或者他人的商业秘密的,应及时停止并删除。
6、robots协议:
文本协议特性:防君子不防小人的文本协议
request模块的基本使用:
什么是requests模块?Python中封装好的一个基于网络请求的模块。
requests模块的作用?用来模拟浏览器发请求
requests模块的环境安装:pip install requests
requests模块的编码流程:指定url、发起请求、获取响应数据、持久化存储
爬取搜狗首页源码数据
import requests
# 1.指定url
url = 'https://www.sogou.com/'
# 2.请求发送get:get返回值是一个响应对象
response = requests.get(url=url)
# 3.获取响应数据
page_text = response.text # 返回的是字符串形式的响应数据
# 4.持久化存储
with open('sogou.html',mode='w',encoding='utf-8') as fp:
fp.write(page_text)
实现一个简易的网页采集器
第一版:
需要让url携带的参数动态化
import requests
url = 'https://www.sogou.com/web'
# 实现参数动态化
wd = input('enter a key:')
params = {
'query': wd
}
# 在请求中需要将请求参数对应的字典作用到params这个get方法的参数中
response = requests.get(url=url, params=params)
page_text = response.text
file_name = wd+'.html'
with open(file_name,encoding='utf-8',mode='w') as fp:
fp.write(page_text)
第二版:
- 上述代码运行后发现:出现了乱码、数据量级不对
- 解决乱码:解决响应数据的编码方式
import requests
url = 'https://www.sogou.com/web'
wd = input('enter a key')
params = {
'query': wd
}
response = requests.get(url=url, params=params)
response.encoding = 'utf-8'
page_text = response.text
filename = wd + '.html'
with open(filename, mode='w', encoding='utf-8') as fp:
fp.write(page_text)
第三版:(加一个headers,模拟浏览器登入)
- UA检测:门户网站通过检测请求载体的身份标识判定该请求是否为爬虫发起的请求
- UA伪装:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36
import requests
url = 'https://www.sogou.com/web'
wd = input('enter a key')
params = {
'query': wd
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'
}
response = requests.get(url=url, params=params, headers=headers)
response.encoding = 'utf-8'
page_text = response.text
filename = wd + '.html'
with open(filename, mode='w', encoding='utf-8') as fp:
fp.write(page_text)
当网页发生局部刷新
- 爬取的是豆瓣电影中电影的详情数据https://movie.douban.com/typerank?type_name=%E7%88%B1%E6%83%85&type=13&interval_id=100:90&action=
- 分析:当滚动条被滑动到页面底部的时候,当前页面发生了局部刷新(ajax的请求)
动态加载的页面数据
是通过例一个单独的请求请求到的数据
import requests
url = 'https://movie.douban.com/j/chart/top_list'
start = input('电影开始')
end = input('电影结束')
dic = {
'type': '13',
'interval_id': '100:90',
'action': '',
'start': start,
'end': end
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'
}
response = requests.get(url=url, params=dic, headers=headers)
page_text = response.json() # json返回的是序列化好的实例对象
for dic in page_text:
print(dic['title']+dic['score'])
请求为post是参数为data——肯德基案例
- 肯德基餐厅查询http://www.kfc.com.cn/kfccda/storelist/index.aspx
- 注意:get请求参数时params,但是post请求参数时data
import requests
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
site = input('请输入地点>>')
for page in range(1, 5):
data = {
'cname':'',
'pid':'',
'keyword': site,
'pageIndex': '1',
'pageSize': '10'
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'
}
response = requests.post(url=url, data=data,headers=headers)
print(response.json())
数据解析简介
数据解析
数据解析的作用:可以帮助我们实现聚焦爬虫
数据解析的实现方式:正则、bs4、xpath、pyquery
数据解析的通用原理:
1.爬虫爬取的数据都被存储在了相关的标签之中和相关标签的属性中
2.定位标签
3.取文本或者取属性
爬取byte类型数据
import requests
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
}
1.爬取byte类型数据(如何爬取图片)
url = 'https://pic.qiushibaike.com/system/pictures/12223/122231866/medium/IZ3H2HQN8W52V135.jpg'
img_data = requests.get(url=url).content # 爬取byte类使用.content
with open('./img.jpg',mode='wb') as fp:
fp.write(img_data)
# 弊端:不能使用UA伪装
from urllib import request
# url = 'https://pic.qiushibaike.com/system/pictures/12223/122231866/medium/IZ3H2HQN8W52V135.jpg'
# request.urlretrieve(url, filename='./qutu.jpg')
<