爬虫 1、用Anaconda的 jupyter notebook 写爬虫

- Anaconda是一个集成环境(基于机器学习和数据分析的开发环境)
- 基于浏览器的一种可视化开发工具:jupyter notebook
- 可以在指定目录的终端中录入jupyter notebook指令,然后启动服务。
- cell是分为不同模式的:
- Code:编写python代码
- markDown:编写笔记
- 快捷键:
- 添加cell:a,b
- 删除cell:x
- 执行:shift+enter
- tab:
- 切换cell的模式:
    - m   ==>markdowm模式
    - y   ==》代码模式
- 打开帮助文档:shift+tab

 

 

环境变量配置

 

 在某个文件夹下shift+右键  打开powershell  输入jupyter notebook打开 web ,即当前目录是web 的根目录

    • 规避风险:

      • 严格遵守网站设置的robots协议;

      • 在规避反爬虫措施的同时,需要优化自己的代码,避免干扰被访问网站的正常运行;

      • 在使用、传播抓取到的信息时,应审查所抓取的内容,如发现属于用户的个人信息、隐私或者他人的商业秘密的,应及时停止并删除。

  • robots协议:文本协议

    • www.xx.com/robots.txt  查看
    • 特性:防君子不防小人的文本协议

二、requtest 

  • 什么是requests模块?
    • Python中封装好的一个基于网络请求的模块。
  • requests模块的作用?
    • 用来模拟浏览器发请求
  • requests模块的环境安装:
    • pip install requests
  • requests模块的编码流程:
    • 1.指定url
    • 2.发起请求
    • 3.获取响应数据
    • 4.持久化存储
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','w',encoding='utf-8') as fp:
    fp.write(page_text)
#爬取搜狗首页的页面源码数据
#需要让url携带的参数动态化
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
fileName = wd+'.html'
with open(fileName,'w',encoding='utf-8') as fp:
    fp.write(page_text)
#实现一个简易的网页采集器

- 上述代码执行后发现:
- 1.出现了乱码
- 2.数据量级不对

url = 'https://www.sogou.com/web'
#实现参数动态化
wd = input('enter a key:')
params = {
    'query':wd
}
#在请求中需要将请求参数对应的字典作用到params这个get方法的参数中
response = requests.get(url=url,params=params)
response.encoding = 'utf-8' #修改响应数据的编码格式
page_text = response.text
fileName = wd+'.html'
with open(fileName,'w',encoding='utf-8') as fp:
    fp.write(page_text)
#解决乱码
  • UA检测:门户网站通过检测请求载体的身份标识判定改请求是否为爬虫发起的请求
  • UA伪装:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36
  • user-agent
url = 'https://www.sogou.com/web'
#实现参数动态化
wd = input('enter a key:')
params = {
    'query':wd
}
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'
}
#在请求中需要将请求参数对应的字典作用到params这个get方法的参数中
response = requests.get(url=url,params=params,headers=headers)
response.encoding = 'utf-8' #修改响应数据的编码格式
page_text = response.text
fileName = wd+'.html'
with open(fileName,'w',encoding='utf-8') as fp:
    fp.write(page_text)
#解决UA检测

三 ajax

#爬取的是豆瓣电影中电影的详情数据

  https://movie.douban.com/typerank?type_name=%E7%88%B1%E6%83%85&type=13&interval_id=100:90&action=
    #分析:

    当滚动条被滑动到页面底部的时候,当前页面发生了局部刷新(ajax的请求)

动态加载的页面数据

  • 是通过另一个单独的请求请求到的数据
url = 'https://movie.douban.com/j/chart/top_list'
start = input('您想从第几部电影开始获取:')
limit = input('您想获取多少电影数据:')

# url 中的参数
dic = {
    'type': '13',
    'interval_id': '100:90',
    'action': '',
    'start': start,
    'limit': limit,
}
response = requests.get(url=url,params=dic,headers=headers)
page_text = response.json() #json()返回的是序列化好的实例对象
for dic in page_text:
    print(dic['title']+':'+dic['score'])
View Code
#肯德基餐厅查询http://www.kfc.com.cn/kfccda/storelist/index.aspx
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
for page in range(1,5):
    data = {
        'cname': '',
        'pid': '',
        'keyword': '西安',
        'pageIndex': str(page),
        'pageSize': '10',
    }
    response = requests.post(url=url,headers=headers,data=data)
    print(response.json())
#肯德基餐厅查询

如何检测页面中是否存在动态加载的数据?

  • 基于抓包工具实现
    • 先捕获网站请求后所有的数据包
    • 在数据包中定位到地址栏所对应请求的数据包,在response选项卡对应的数据中进行局部搜索(页面中的某一组内容)
      • 可以搜索到:爬取的数据不是动态加载的
      • 没有搜索到:爬取的数据是动态加载的
    • 如何定位动态加载的数据在哪个数据包中呢?
      • 进行全局搜索
原文地址:https://www.cnblogs.com/zhuangdd/p/13648140.html