Day01 爬虫入门学习:动态数据加载,爬取图片,json嵌套形式读取数据

文章目录

  • 爬虫学习
    • 1.爬虫基本概念
    • 2.异常的访问请求
    • 3.动态数据的加载
    • 4.爬取图片的两种方式

爬虫学习

整理一下今天学习的内容,因为在以后的数据分析行业中会用到数据采集,所以打算花一段时间来学习爬虫。
可能是因为不太会,感觉很多网站的反爬机制都在不断的更新…

1.爬虫基本概念

  • 爬虫-就是通过编写程序,让其模拟浏览器上网,然后去互联网上抓取数据的过程
    • 模拟:浏览器就是一款天然的爬虫工具
    • 抓取:抓取一整张数据,抓取一整张数据的局部数据
  • 爬虫的分类
    • 通用爬虫:
      • 抓取一整张页面源码数据
    • 聚焦爬虫:
      • 抓取局部的指定的数据,是建立在通用爬虫基础之上的
    • 增量式爬虫:
      • 监测网站数据的更新情况,抓取网站最新更新出来的数据
    • 分布式爬虫
  • 反爬机制
    • 1.robots协议:存在于服务器网站的一个文本协议,指名了该网站中哪些数据可以爬取哪些不可以爬取(有些网站可以查看到,比如jd.com, 有些网站我还不会看)
  • 反反爬策略

1.request是常用的爬虫包,首先获取一个简单的html页面

import requests
url='https://www.baidu.com/'
response=requests.get(url=url)
page_text=response.text
with open('./taobao.html','w',encoding='utf-8') as fp:
    fp.write(page_text)

2.异常的访问请求

- 在爬虫中正常的访问请求指的是通过真实的浏览器发起的访问请求
- 异常的访问请求,通过非浏览器发起的请求(爬虫程序模拟的请求)
  • 正常的访问请求和异常访问请求判别机制
    • 通过请求头中的User-Agent判别
    • User-Agent:请求载体的身份标识
    • 目前请求的载体可以是:浏览器,爬虫
  • 反爬机制
    • UA检测:网站后台会检测请求载体的身份标识(UA)是不是浏览器
    • 是:正常访问请求
    • 否:异常访问请求
  • 反反爬策略
    • UA伪装:将爬虫对应的请求载体身份标识伪装/篡改成浏览器的身份标识
    • User-Agent: 根据每个人的浏览器进行查找,点击F12查看页面源代码,找到Network,User-Agent的位置在network的Headers下面,可以参考下图,圈起来的就是User-Agent
      Day01 爬虫入门学习:动态数据加载,爬取图片,json嵌套形式读取数据_第1张图片
word=input('enter a word:')
url='https://www.baidu.com/'
#UA伪装
headers={
     
    "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
#将伪装的UA作用到了请求的请求头中
response=requests.get(url=url,headers=headers)
page_text=response.text
print(page_text)

上面的代码就实现了UA伪装。

3.动态数据的加载

  • 概念:通过非浏览器地址栏url请求到的数据(另外一个新的请求请求到的数据)
  • 当我们对一个陌生的网站进行指定数据爬取之前,写代码之前必须要做的一个事情就是校验你想要爬取的数据是否为动态加载数据,
    • 是动态加载的数据
      • 基于抓包工具进行全局搜索,锁定动态加载数据对应的数据包即可,从数据包中提取请求的url和请求方式和请求参数
    • 不是动态加载的数据
      • 直接对地址栏的url发起请求就可以获取指定数据

下面举一个从豆瓣爬取电影名称及电影评分的例子,爬取的豆瓣电影界面如下(部分):
Day01 爬虫入门学习:动态数据加载,爬取图片,json嵌套形式读取数据_第2张图片
其中需要爬取的豆瓣电影名称和评分就属于动态数据。

# word=input('enter a word:')
url='https://movie.douban.com/j/search_subjects'
# ?type=movie&tag=%E7%A7%91%E5%B9%BB&sort=recommend&page_limit=20&page_start=0
#参数动态化
params={
     
    "type": "movie",
    "tag": "科幻",
    "sort": "recommend",
    "page_limit": "100",
    "page_start": "0",
}
#将伪装的UA作用到了请求的请求头中
headers={
     
    "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
response=requests.get(url=url,headers=headers,params=params)
page_text=response.json()#json返回的是序列好的对象
# page_text
#将电影名称和评分进行解析
for dict in page_text['subjects']:
    name = dict['title']
    rate = dict['rate']
    print(name+":"+rate)

上面的代码输出结果如下图:
Day01 爬虫入门学习:动态数据加载,爬取图片,json嵌套形式读取数据_第3张图片
在这里还涉及到一个使用python读取嵌套json数组的问题,因为page_text的输出形式如下(部分):
Day01 爬虫入门学习:动态数据加载,爬取图片,json嵌套形式读取数据_第4张图片
可以看到page_text的输出是一个多层嵌套的json形式,于是在这里可以使用下面的代码获取page_text里面的内容:

for dict in page_text['subjects']:
    name = dict['title']
    rate = dict['rate']
    print(name+":"+rate)

也可以采用jsonpath的方式获取,方式如下:

# json处理嵌套数组
import jsonpath
for dict in page_text['subjects']:
    name=jsonpath.jsonpath(dict,'$..title')
    rate=jsonpath.jsonpath(dict,'$..rate')
    print(name,rate)

输出如下图(部分):
Day01 爬虫入门学习:动态数据加载,爬取图片,json嵌套形式读取数据_第5张图片
两种方式都可以读取到json嵌套形式中的数据。

下面再介绍一个肯德基餐厅查询

  • KFC餐厅查询:http://www.kfc.com.cn/kfccda/storelist/index.aspx
  • 分析:
    • 数据为动态加载数据
    • 通过抓包工具的全局搜索捕获动态加载数据

肯德基餐厅信息查询界面如下图所示
Day01 爬虫入门学习:动态数据加载,爬取图片,json嵌套形式读取数据_第6张图片
在这里爬取北京所有KFC餐厅的信息,因为页面内显示北京餐厅信息有8页,所以设置for循环,代码如下:

url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
for pageNum in range(1,8):
    data={
     
        "cname": "",
        "pid": "",
        "keyword": "北京",
        "pageIndex": str(pageNum),
        "pageSize": "10",
    }
    #参数data是用来实现参数动态化,等同于get方法中的params参数的作用
    response = requests.post(url=url,headers=headers,data=data)
    page_text = response.json()
    for dic in page_text['Table1']:
        pos = dic['addressDetail']
        print(pos)

输出结果如下图(部分):
Day01 爬虫入门学习:动态数据加载,爬取图片,json嵌套形式读取数据_第7张图片

4.爬取图片的两种方式

  • 下面再讲一下简单的爬取页面内某张图片的两种方式:
    • 方式1:requests
    • 方式2:urllib

首先要找到图片的链接,下面分别使用requests和urllib获取图片:

#requests
url='http://pic.sc.chinaz.com/files/pic/pic9/202002/zzpic23387.jpg'
response = requests.get(url=url,headers=headers)
img_data = response.content #content返回的是bytes类型的相应数据
with open('./123.png','wb') as fp:
    fp.write(img_data)
    
#urllib
from urllib import request
utl = 'http://pic.sc.chinaz.com/files/pic/pic9/202002/zzpic23387.jpg'
request.urlretrieve(url=url,filename='./456.png')

将图片另存为,在存储的位置打开就可以看到爬取下来的图片,两种图片爬取方式的主要区别在于 requests的方式可以实现UA伪装,而urllib无法实现UA伪装。
今天就学习到这里了,明天也要继续加油啊…
(半个月之前投的携程简历发了笔试链接,果然还是不能提前批呀,好好准备笔试吧,本来以为都凉了…没有完成4月之前找到实习的计划,继续加油吧。)

你可能感兴趣的:(爬虫,python,数据分析,爬虫)