2019.5.13,今天在“小猿圈”跟着波波老师学习了爬虫开发的第一章和第二章,总结下今天学的知识:
爬虫基础介绍:
什么是爬虫?
- 通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程。
爬虫的价值:
- 实际应用
- 就业
爬虫究竟是合法还是违法的?
- 在法律中不被禁止
- 具有违法风险
- 善意爬虫 恶意爬虫
爬虫带来的风险可以体现在如下两个方面:
- 爬虫干扰了被访问网站的正常运营
- 爬虫抓取了受到法律保护的特定类型的数据或信息
如何在使用编写爬虫的过程中避免进入局子的厄运呢?
- 时常优化自己的程序,避免干扰被访问网站的正常运行
- 在使用,在使用,传播爬取到的数据时,审查抓取到的内容,如果发现了设计到用户
隐私商业机密等敏感内容需要及时停止爬取或传播
爬虫在使用场景中的分类:
- 通用爬虫:
抓取系统重要组成部分。抓取的是一整张页面数据。
- 聚焦爬虫:
是建立在通用爬虫的基础之上,抓取的是页面中特定的局部内容。
- 增量式爬虫:
检测网站中数据更新的情况,只会抓取网站中更新出来的数据。
爬虫的矛与盾
反爬机制
- 门户网站,可以通过制定相应的策略或者技术手段,防止爬虫程序进行网站数据的爬取。
反反爬策略
- 爬虫程序可以通过制定相关的策略或者技术手段,破解门户网站中具备的反爬机制,
从而可以获取门户网站的数据
robots.txt协议:
- 君子协议。规定了网站中哪些数据可以被爬虫爬取哪些数据不可以被爬取
http协议
- 概念:就是服务器和客户端进行数据交互的一种形式。
常用请求头信息
- User-Agent:请求载体的身份标识
- Connection:请求完毕后,是断开连接还是保持连接
常用响应头信息
- Content-Type:服务器响应回客户端的数据类型
https协议:
- 安全的超文本传输协议
加密方式
- 对称密钥加密
发送方将密钥通过网络传输给接收方
- 非对称密钥加密
发送方创建密钥对,对文件用公钥进行加密,将公钥传输给接收方,用密钥对和私钥解密
- 证书密钥加密
对公钥进行数字签名,将公钥和证书绑定在一起发送给接收方
requests模块基础:
requests模块:python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高。
作用:模拟浏览器发请求。
如何使用:(requests模块的编码流程)
- 指定urL发起请求
- 获取响应数据
- 持久化存储
环境安装:
- pip install requests
- 也可以在pycharm中:Settings --> Project --> Project Interpreter --> "+" 添加requests
实战编码:
- 需求:爬取搜狗首页的页面数据
实战巩固
- 需求:爬取搜狗指定词条对应的搜索结果页面(简易网页采集器)
- UA检测
- UA伪装
- 需求:破解百度翻译
- post请求(携带了参数)
- 响应数据是一组json数据(如何确认?)
打开页面 --> F12 --> Network --> Headers --> Response Headers
--> Content-Type --> application/json
- 需求:爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据
- 打开页面 --> F12 --> 滑动混轮,出现新的Name --> 查看Headers信息
--> 用的是get()方法 --> 下拉到底端 --> 找到应该配置的参数后写入字典
--> 将字典参数传到get()方法的形参params中
- 需求:爬取肯德基餐厅查询http://www.kfc.com.cn/kfccda/index.aspx中指定地点的餐厅数
- 需求:爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据
http://125.35.6.84:81/xk/
1 # Author:K 2 # 需求:爬取搜狗首页的页面数据 3 4 import requests 5 6 # step 1:指定url 7 url = 'https://www.sogou.com/' 8 9 # step 2:发起请求 10 response = requests.get(url = url) # get()方法会返回一个相应对象 11 12 # step 3:获取响应数据: 13 page_text = response.text # text方法返回的是字符串形式的相应数据 14 print(page_text) 15 16 # step 4:持久化存储 17 with open('./sogou.html','w',encoding='utf-8') as fp: 18 fp.write(page_text) 19 20 print("爬取数据结束!")
1 # Author:K 2 import requests 3 4 # UA伪装: 5 headers = { 6 "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36" 7 } 8 9 keyword = input("Please input keyword:") 10 url = 'https://www.sogou.com/web?' 11 12 # 参数设置: 13 params = { 14 'query':keyword 15 } 16 17 response = requests.get(url = url,params = params,headers = headers) 18 19 data = response.text 20 21 fileName = keyword + '.html' 22 with open(fileName,'w',encoding='utf-8') as fp: 23 fp.write(data) 24 25 print("爬取结束!")
1 # Author:K 2 3 import requests 4 import json 5 6 url = 'https://fanyi.baidu.com/sug' 7 8 headers = { 9 "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36" 10 } 11 12 kw = input("Please input keyword:") 13 data = { 14 'kw':kw 15 } 16 17 response = requests.post(url = url,data = data,headers = headers) 18 19 dic_obj = response.json() # 要确定服务器响应的son数据才能使用此方法 20 21 # 存储到本地 22 fileName = kw + '.json' 23 fp = open(fileName,'w',encoding='utf-8') 24 json.dump(dic_obj,fp = fp,ensure_ascii=False) # json文件中有中文,不能使用ascii编码 25 26 print("爬取结束!")
1 # Author:K 2 import requests 3 import json 4 5 url = 'https://movie.douban.com/j/chart/top_list' 6 7 start_movie = input("Please input number that which movie you want to choose first:") 8 limit_movie = input("Please input number that how many movie one time display:") 9 10 params = { 11 "type": "5", 12 "interval_id": "100:90", 13 "action": "", 14 "start": start_movie, # 从第几部电影开始取 15 "limit": limit_movie, # 一次取多少部 16 } 17 18 headers = { 19 "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36" 20 } 21 22 response = requests.get(url = url,params = params,headers = headers) 23 24 list_obj = response.json() 25 26 fileName = "doubanMovie.json" 27 fp = open(fileName,'w',encoding = 'utf-8') 28 json.dump(list_obj,fp = fp,ensure_ascii = False) 29 30 print("Successful crawling!")
1 # Author:K 2 #--------------------------为什么查询不出来???? 3 import requests 4 5 url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword' 6 7 headers = { 8 "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36" 9 } 10 11 #kw = input("Please input keyword:") 12 page_index = input("Which page you want to choose first:") 13 page_size = input("The pageSize is:") 14 15 data = { 16 "cname": " ", 17 "pid": " ", 18 "keyword": "北京", 19 "pageIndex": page_index, 20 "pageSize": page_size, 21 } 22 23 response = requests.post(url = url,data = data,headers = headers) 24 page_text = response.json() 25 print(page_text) 26 fileName = "KFC restaurant.txt" 27 with open(fileName,'w',encoding = 'utf-8') as fp: 28 fp.write(str(page_text)) 29 30 print("Successful crawling!")
1 # Author:K 2 import requests 3 import json 4 5 url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList' 6 7 headers = { 8 "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36" 9 } 10 11 all_data_list = [] # 存储企业详情数据 12 id_list = [] # 存储企业对应的id 13 14 for page in range(1,5): # !!!!!!!!!!!!为什么这里范围大了就不行????????? 15 data = { 16 "on": " true", 17 "page": str(page), 18 "pageSize": " 15", 19 "productName": " ", 20 "conditionType": " 1", 21 "applyname": " ", 22 "applysn": " ", 23 } 24 25 dic_info = requests.post(url = url,data = data,headers = headers).json() 26 27 for dic in dic_info["list"]: 28 id_list.append(dic["ID"]) 29 30 info_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById' 31 for id in id_list: 32 id_data = { 33 "id":id 34 } 35 36 info_response = requests.post(url = info_url,data = id_data,headers = headers) 37 dic_data = info_response.json() 38 all_data_list.append(dic_data) 39 40 # 持久化存储 41 fileName_data = "data.json" 42 fp = open(fileName_data,'w',encoding = 'utf-8') 43 json.dump(all_data_list,fp = fp,ensure_ascii = False) 44 45 print(len(all_data_list)) 46 print("successful crawling!")
其中肯德基餐厅查询和药监总局这两个案例未解决。后续在补充!