python网络爬虫基础day01

  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!")
药监总局(未解决)
 

 

其中肯德基餐厅查询和药监总局这两个案例未解决。后续在补充!















  

转载于:https://www.cnblogs.com/KisInfinite/p/10859792.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

忘记mysql数据库连接密码

本次操作所有需要用到的密令行: bin>net stop mysql bin>mysqld --skip-grant-tables bin>mysql mysql>use mysql mysql>update user set passwordpassword("123456") where user"root"; mysql>flush privileges; mys…

Python 基础 函数

1:调用函数 eg:调用内置函数 abs() 求绝对值 2:定义函数 1:定义一个函数要使用 def 语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用ret…

Springmvc跨服务器文件上传报403,409错误

报403错误 Tomcat默认只读模式&#xff0c;传图片会被拒绝 解决&#xff1a;找到 Tomcat 目录---conf下---web.xml&#xff0c;打开 加入 <init-param><param-name>readonly</param-name><param-value>false</param-value> </init-param&g…

Vue中message.split().reverse().join()函数用法

1、split() 把一个字符串分割成字符串数组 把数据拆分为一个数组,括号里的 是把数据拆分为每个字符串 2、reverse() 颠倒数组中元素的顺序 只作用于数组&#xff0c;跟在split()后才能起作用&#xff0c;在一个字符串后面不起作用&#xff0c;如message.reverse() 3、join()…

单元测试——Winfrom

一、新建单元测试项目 二、单元测试可在Service或者Repository层分别创建 三、编写好代码后可运行单元测试 转载于:https://www.cnblogs.com/772933011qq/p/10863817.html

vue报错:dependencies were not found: * element-ui in ./src/main.js * element-ui/lib/theme-chalk/inde

报错信息 These dependencies were not found: * element-ui in ./src/main.js * element-ui/lib/theme-chalk/index.css in ./src/main.js 解决方案 1、 cmd进入命令行窗口&#xff0c;切入运行的项目文件夹下 2、输入 cnpm i element-ui -S(没有装淘宝镜像的使用 npm i…

Spring的配置与使用

一、Spring的组成 其中最核心的是Core Container核心容器 二、spring框架的作用&#xff1a; 对于我目前了解的spring框架&#xff0c;其中一个作用是用来降低程序间的耦合度的&#xff0c;也就是降低程序间的依耐性。 IOC&#xff1a;inversion of control 控制反转-->即将…

选择日期保存报错Invalid JSON input: Cannot deserialize value of type `java.util.Date` from String......

(spring boot vue&#xff09; 1、新增-选择日期-点击保存-报错&#xff1a;报错信息 "Invalid JSON input: Cannot deserialize value of type java.util.Date from String "2020-07-05T16:00:00.000Z": not a valid representation (error: Failed to pars…

个人冲刺10

1.昨天做了界面整体优化。 2.今天打算了解一下组成员的情况。 3.整体界面优化没有什么问题。转载于:https://www.cnblogs.com/Evak/p/10936847.html

新增或编辑保存时出错后,页面无法再次编辑

新增或编辑保存时出错后&#xff0c;页面无法再次编辑&#xff0c;除非关闭新增或编辑弹窗&#xff0c;重新打开新增或编辑页面&#xff0c;否则无法编辑 &#xff0c;如下图&#xff1a; 解决方案 在新增方法之前定义loading参数&#xff0c;在调用后台服务之前先使用loading…

avue下拉框中属性可以显示,但不能选中

1、avue下拉框中属性可以显示&#xff0c;但不能选中 追其原因&#xff0c;我对表单分组了&#xff0c;下拉框放在了group组内的column组里面&#xff0c;导致层数过多&#xff0c;产生死循环的bug 2、解决方法&#xff1a; 取消分组&#xff0c;把所有的属性放到column属性里…

1-4 无监督学习(Unsupervised Learning)

无监督学习定义&#xff1a; 【无监督学习】中没有任何的标签或者是有相同的标签或者就是没标签。所以我们已知数据集&#xff0c;却不知如何处理&#xff0c;也未告知每个数据点是什么。别的都不知道&#xff0c;就是一个数据集。你能从数据中找到某种结构吗&#xff1f;针对数…

选择日期保存后日期变成前一天(avue date)

1、问题&#xff1a;选中日期&#xff0c;保存&#xff0c;日期变成前一天 {label: 生产日期,prop: esDate,type: date,}, 2、解决&#xff1a;&#xff08;avue的官方文档&#xff09; {label: 生产日期,prop: esDate,type: date,valueFormat: yyyy-MM-dd}, 只需要加 value…

IDEA配置tomcat部署web项目时没有artifacts

重命名module可能会出现此问题 会有提示没有artifacts&#xff0c;点击Fix&#xff0c;添加artifacts以解决 debug运行可能会报错&#xff0c;查看日志说1099端口号已被使用 命令行&#xff1a; netstat -ano | find "1099" tasklist | find "840" 840是LI…

v-region 地址组件无法回显问题(选择地址保存后,打开编辑,发现刚才选择的地址【省市县乡】信息消失,信息不回显)

(Avue) 1、问题 v-region 地址组件无法回显(选择地址保存后&#xff0c;打开编辑&#xff0c;发现刚才选择的地址【省市县乡】信息消失&#xff0c;信息不回显) 选择好省市县乡后&#xff0c;保存&#xff0c;再次编辑&#xff0c;发现如下&#xff1a; 2、解决方案&#xff…

JavaScript中一个对象数组按照另一个数组排序

JavaScript中一个对象数组按照另一个数组排序 需求&#xff1a;排序 const arr1 [33, 11, 55, 22, 66];const arr2 [{age: 55}, {age: 22}, {age: 11}, {age: 66}, {age: 33}]数组arr2中每项都是一个对象&#xff0c;对象中age属性 数组arr1中的项将arr2数组根据对象的age值…

【JS】逻辑运算符 非! 与 或||(处理对象时注意)

转自&#xff1a;https://www.cnblogs.com/linxiong945/p/4135554.html JS中的逻辑运算符在处理布尔值的判断时&#xff0c;和其他语言没有什么不同&#xff0c;不过在处理对象时&#xff0c;就需要好好梳理记忆下了。 逻辑非&#xff08;!&#xff09; 如果一个操作数是一个对…

什么是跨域(定义理解错误)

什么是跨域 当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域 当前页面url 被请求页面url 是否跨域 原因http://www.test.com/http://www.test.com/index.html 否 同源&#xff08;协议、域名、端口号相同&#xff09;http://www.test.com/ ht…

存储池与存储卷,使用virt-install创建虚拟机

原文链接&#xff1a;https://www.cnblogs.com/zknublx/p/9199658.html 创建存储池 1.建立存储池的目录 mkdir /kvm/images 2.为了安全性&#xff0c;更改目录的所有者&#xff0c;并设置权限 chown root:root /kvm/images chmod 700 /kvm/images 验证一下 ls -a /kvm/images 3…

oracle mysql 常用语句(查询表中某字段有几种类型,及每种类型有多少个数、插入多行、查询前几行)

亲测有效 1、&#xff08;1&#xff09;查询表中某字段有几种类型&#xff0c;及每种类型有多少个数 select DISTINCT name user_name,count(*) num from patient GROUP BY name &#xff08;2&#xff09;查询表中某字段类型共有几种 select count(distinct name) from pat…