python爬虫-爬虫的基础知识储备

请添加图片描述
  爬虫就是一个不断的去抓去网页的程序,根据我们的需要得到我们想要的结果!但我们又要让服务器感觉是我们人在通过浏览器浏览不是程序所为!归根到底就是我们通过程序访问网站得到html代码,然后分析html代码获取有效内容的过程。下面让我们从最简单的爬虫开始:

爬取一个页面源代码

在python中,抓取网页的库是urllib2。下面看一个最简单的例子:

1 import urllib2
2 response = urllib2.urlopen('http://www.baidu.com/')
3 html = response.read()
4 print html

执行完成后你会发现窗口中打出了一堆代码,其实就是百度主页的html代码!(抵制百度!!!)

我们来看一下urlopen的用法:

1 >>> help(urllib2.urlopen)
2 Help on function urlopen in module urllib2:
3 
4 urlopen(url, data=None, timeout=<object object>, cafile=None, capath=None, cadefault=False, context=None)

第一个参数为url,第二个为要发送的数据,第三个是超时时间。其余的我们一般不用,就不解释了!第二三个参数不是必须的,因为都有默认值,data默认值为None,timeout默认值为socket._GLOBAL_DEFAUTL_TIMEOUT。传入url之后,我们得到一个response对象,返回的信息就在这里面!通过response.read()获取里面的内容。同样的我们可以构造一个Request类,作为参数传入urlopen中,这个Request类中就包含url,data,timeout等内容。上面的代码我们可以写成这样:

1 import urllib2
2 
3 request = urllib2.Request("http://www.baidu.com")
4 response = urllib2.urlopen(request)
5 print response.read()

这样是不是很清晰明了了?在构建Request的时候我们通常会加入很多内容,我们发出一个请求,服务器给我们一个响应。一个简单的爬虫就这样起飞了!

POST和GET数据传送

平常我们在浏览网页的时候难免涉及到登录注册,填写表单,或者跳转到某个页面,这时候我们要跟服务器进行交互,向服务器发送数据,发送数据的方式呢就是Post和Get,两者的区别在于GET方式直接以链接的形式访问,链接中包含所有的参数,如:http://www.baidu.com/shit?result=true 其中 result=true就是Get传递的数据,POST相当于Get就安全多了,它不会在链接上显示所有参数。

Post方式:

 1 import urllib 2 import urllib2 3 4 values = {} 5 values\['username'\] = "977610289@qq.com"6 values\['password'\] = "\*\*\*\*\*\*"7 data = urllib.urlencode(values) 8 url = "http://www.xxx.com/login?from=http://xxx/loginInfo"9 request = urllib2.Request(url,data)
10 response = urllib2.urlopen(request)
11 print response.read()

在上面的代码中,我们创建了一个字典values,设置了username和password的值,然后通过urlencode函数将字典进行转码,命名为data,然后用url和data实例化了一个Request类,传递给urlopen()。

Get方式:

 1 import urllib 2 import urllib2 3 4 values={}5 values\['username'\] = "977610289@qq.com"6 values\['password'\]="\*\*\*\*\*\*"7 data = urllib.urlencode(values) 8 url = "http://www.xxx.com/login"9 geturl = url + "?"+data
10 request = urllib2.Request(geturl)
11 response = urllib2.urlopen(request)
12 print response.read()

在上面的代码中,我们创建了一个字典values,设置了username和password的值,然后通过urlencode函数将字典进行转码,命名为data,然后我们把data拼接在了url中,我们会得到这样的url:http://www.xxx.com/login?username=977610289%40qq.com&password=******。

在实现一个爬虫的时候,我们要根据需要,选择post或者get方式进行访问!不过除了上面那些还不够,现在网站为了避免爬虫去访问会进行一些检测,如果检测不通过就不会响应你的请求,为了完全模拟浏览器工作,我们往往要设置一些headers属性,以及防盗链:

1 headers = { 'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'  ,
2                         'Referer':'http://www.zhihu.com/articles' }    3 request \= urllib2.Request(url, data, headers)#利用data headers构造Request对象

有些网站可能会检测ip等,我们可能会用到urllib2的代理,有些网站响应过慢我们可以设置其timeout。在访问网站的情况下我们可能会遇到一些网站错误,我们要在程序中进行处理(一如既往的try… except…得到错误信息内容):

 1 import urllib2 2 3 req = urllib2.Request('http://www.xxx.com')4 try:5     urllib2.urlopen(req)6 except urllib2.URLError, e: 7     if hasattr(e,"code"):8         print e.code 9     if hasattr(e,"reason"):
10         print e.reason
11 else:
12     print "OK"

常见的错误代码:400 非法请求 403 禁止访问 404 未找到资源 500 服务器内部错误 200 访问成功。

在网页访问过程中,不可避免的要用到cookies,我们的程序要模拟浏览器的行为,在访问网页的时候有时候要带上特定的cookies,这样才能成功访问网页。关于cookies我们用到了cookielib,cookielib模块提供可存储cookie的对象,以便于与urllib2配合使用进行网站访问,利用其中的CookieJar类捕获和发送cookie,实现模拟登录,维持登录状态等。

获取cookie保存到变量:

 1 import urllib2 2 import cookielib 3 #声明一个CookieJar对象实例来保存cookie4 cookie = cookielib.CookieJar() 5 #利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器6 handler=urllib2.HTTPCookieProcessor(cookie)7 #通过handler来构建opener8 opener = urllib2.build\_opener(handler) 9 #此处的open方法同urllib2的urlopen方法,也可以传入request
10 response = opener.open('http://www.baidu.com')
11 for item in cookie:
12     print 'Name = '+item.name
13     print 'Value = '+item.value
14 #利用cookie请求访问另一个网址
15 gradeUrl = 'http://www.baidu.com/xxx/xx'
16 #请求访问
17 result = opener.open(gradeUrl)
18 print result.read()

上面程序创建了一个带有cookie的opener,在访问登录url的时候,将登录后的cookie保存下来,然后利用这个cookie来访问其他的网址。

下面放一个HttpClient.py,里面包含了post和get方法,以及getcookies:

 1 import cookielib, urllib, urllib2, socket 2 3 class HttpClient: 4   \_\_cookie = cookielib.CookieJar() 5   \_\_req = urllib2.build\_opener(urllib2.HTTPCookieProcessor(\_\_cookie))6   \_\_req.addheaders = \[ 7     ('Accept', 'application/javascript, \*/\*;q=0.8'),8     ('User-Agent', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)')9 \]
10   urllib2.install\_opener(\_\_req)
11 
12   def Get(self, url, refer=None):
13     try:
14       req = urllib2.Request(url)
15       if not (refer is None):
16         req.add\_header('Referer', refer)
17       return urllib2.urlopen(req, timeout=120).read()
18     except urllib2.HTTPError, e:
19       return e.read()
20     except socket.timeout, e:
21       return ''
22     except socket.error, e:
23       return ''
24 
25   def Post(self, url, data, refer=None):
26     try:
27       req = urllib2.Request(url, urllib.urlencode(data))
28       if not (refer is None):
29         req.add\_header('Referer', refer)
30       return urllib2.urlopen(req, timeout=120).read()
31     except urllib2.HTTPError, e:
32       return e.read()
33     except socket.timeout, e:
34       return ''
35     except socket.error, e:
36       return ''
37 
38   def Download(self, url, file):
39     output = open(file, 'wb')
40 output.write(urllib2.urlopen(url).read())
41 output.close()
42 
43   def getCookie(self, key):
44     for c in self.\_\_cookie:
45       if c.name == key:
46         return c.value
47     return ''
48 
49   def setCookie(self, key, val, domain):
50     ck = cookielib.Cookie(version=0, name=key, value=val, port=None, port\_specified=False, domain=domain, domain\_specified=False, domain\_initial\_dot=False, path='/', path\_specified=True, secure=False, expires=None, discard=True, comment=None, comment\_url=None, rest={'HttpOnly': None}, rfc2109=False)
51     self.\_\_cookie.set\_cookie(ck)```本文仅做项目练习,切勿商用!!!由于文章篇幅有限,文档资料内容较多,需要这些文档的朋友,可以加小助手微信免费获取,【保证100%免费】,中国人不骗中国人。
![请添加图片描述](https://img-blog.csdnimg.cn/direct/764017f23c4b421c85b5a743aa35f9df.jpeg)
全套Python学习资料分享:
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/0de253c180b84fddaee472ec8bf186cd.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/bbdf25abb6924f03ad346040a19aa79c.png)
二、学习软件工欲善其事必先利其器。学习Python常用的开发软件都在这里了,还有环境配置的教程,给大家节省了很多时间。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/cf4113ddfa6f4b958b4a3a7fc63cc751.png)
三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/7ef51a6e1e4348cfb489ec6ca3c5ac08.png)
四、入门学习视频全套
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/3e958a378b9643dd870e22ecaa5b4618.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/bca844238a354a7e92cb47646ce2a071.png)
五、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/cf95b3870570440aa23d5dc35864c396.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/57e3b7dfce794d28bb72025700c530af.png)
今天的分享就到这里,感谢大家收看

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

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

相关文章

【Python实战因果推断】1_因果效应异质性1

目录 From ATE to CATE Why Prediction Is Not the Answer CATE and ITE 本文将介绍应用于行业的因果推理中最有趣的发展&#xff1a;效应异质性。在此之前&#xff0c;你们了解的是一种治疗方法的一般影响。现在&#xff0c;你将专注于发现它如何对不同的人产生不同的影响。…

Java | Leetcode Java题解之第198题打家劫舍

题目&#xff1a; 题解&#xff1a; class Solution {public int rob(int[] nums) {if (nums null || nums.length 0) {return 0;}int length nums.length;if (length 1) {return nums[0];}int first nums[0], second Math.max(nums[0], nums[1]);for (int i 2; i <…

【Oracle篇】逻辑备份工具expdp(exp)/impdp(imp)和物理备份工具rman的区别和各自的使用场景总汇(第八篇,总共八篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

链表数组遍历输出的辨析(二者都含指针的情况下)----PTA期末复习题

输入输出三位学生的学号和信息 一开始我认为是指针&#xff0c;直接背了指针输出的方式&#xff1b;p;p!NULL;pp->next 这个是错误的 下面这个输出是正确的方式 分析怎么区分这两个 举个例子来 数组遍历&#xff1a; 链表遍历&#xff1a; 输出的结果&#xff1a; 如果将…

Android小技巧:利用动态代理自动切换线程

日常开发中&#xff0c;多线程编程是个难以避免的话题&#xff0c;开发者可以小心翼翼、谨慎地、严谨地编程来编写出高效的、安全的多线程程序&#xff0c;但是在长时间的维护中&#xff0c;难免因为其中某个人的某个疏忽而导致出现预料之外的并发问题&#xff0c;比如下面这个…

【XCharts插件】5-1、从Json中读取数据并更新图表案例(v3.0)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群:398291828大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 XCharts插件是一款基于UGUI的功能强大、易用、参数可配置的数据可视化图表插件。 【Unity3D…

区块链技术与数字货币

1.起源 ➢中本聪(Satoshi Nakamoto), 2008 ➢比特币:一种点对点的电子现金系统 2.分布式账本技术原理 1.两个核心技术&#xff1a; ➢以链式区块组织账本数据实现账本数据的不可篡改 ➢分布式的可信记账机制 2.共识机制&#xff1a;由谁记账 ➢目的&#xff1a; ⚫ 解…

【数据结构(邓俊辉)学习笔记】二叉搜索树03——平衡

文章目录 1. 极端退化2. 平均高度3. 理想 适度4. 歧义 等价5. 等价变换 1. 极端退化 二叉搜索树为我们同时实现对数据集高效的静态操作以及动态操作打开了一扇新的大门。 正如我们所看到的&#xff0c;从策略上&#xff0c;BST可以视作是试图将此前的向量结构以及列表结构优…

SpringBoot整合MongoDB JPA使用

一、整合MongoDB SpringDataMongoDB是 SpringData家族成员之一&#xff0c;MongoDB的持久层框架&#xff0c;底层封装了 mongodb-driver。mongodb-driver 是 MongoDB官方推出的 Java连接 MongoDB的驱动包&#xff0c;相当于JDBC驱动。 SpringBoot整合 MongoDB&#xff0c;引入…

jetson 安装 Rustdesk失败

报错: rustdesk depends on gstreamer1.0-pipewire; however: Package gstreamer1.0-pipewire is not installed. 原因&#xff1a; 对于rustdesk&#xff0c;其1.2.3 版需要gstreamer1.0-pipewire软件包&#xff0c;但是此软件包仅适用于 Ubuntu 22.04、22.10、23.04 和 2…

Python数据分析入门:探索数据集

在数据科学领域&#xff0c;Python以其简洁的语法和强大的库支持&#xff0c;成为最受欢迎的编程语言之一。无论是数据清洗、探索性数据分析还是复杂的机器学习任务&#xff0c;Python都能提供相应的工具。本文将引导你使用Python进行简单的数据分析&#xff0c;以一个公开的数…

C语言 用下面的scanf函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1=‘A’,c2=‘a’。在键盘上应该如何输入?

用下面的scanf函数输入数据&#xff0c;使a3&#xff0c;b7&#xff0c;x8.5&#xff0c;y71.82&#xff0c;c1‘A’,c2‘a’。在键盘上应该如何输入&#xff1f; #include<stdio.h> int main() { int a&#xff0c;b&#xff1b; float x,y; char c1,c2; scanf(“…

k8s_如何修改k8s使用docker或者container作为容器运行时

如果 kubelet.conf 没有明确的容器运行时相关设置&#xff0c;并且你希望配置 Kubernetes 使用 Docker 或 containerd 作为容器运行时&#xff0c;可以通过以下步骤进行配置。具体的配置步骤如下&#xff1a; 配置 Kubernetes 使用 Docker 作为容器运行时 确保 Docker 已安装并…

js中的浅拷贝和深拷贝

浅拷贝Shallow Copy 浅拷贝只复制对象的顶层属性及其引用&#xff0c;而不复制这些引用所指向的对象。如果原始对象中的某个属性是一个对象或数组&#xff0c;那么浅拷贝后的对象将包含对这个内部对象或数组的引用&#xff0c;而不是这个对象或数组的一个新副本。 let obj1 …

【Mac】XnViewMP for Mac(图片浏览查看器)及同类型软件介绍

软件介绍 XnViewMP 是一款多功能、跨平台的图像查看和管理软件&#xff0c;适用于 macOS、Windows 和 Linux 系统。它是经典 XnView 软件的增强版本&#xff0c;更加现代化且功能更强大。XnViewMP 支持数百种图像格式&#xff0c;并提供多种图像处理工具&#xff0c;使其成为摄…

【摄像头标定】使用kalibr进行双目摄像头标定(ros1、ros2)

使用kalibr进行双目摄像头标定 前言标定板标定①板端准备和录制②上位机准备和标定 前言 本文不是纯用ros1进行标定&#xff0c;需要ros1和ros2通信。给使用ros2进行开发&#xff0c;但又想用kalibr标定双目摄像头的小伙伴一个教程。本文双目摄像头的数据发布使用ros2&#xf…

认识Unity中的音效

一、Audio Clip&#xff1a;音频片段 一个AudioClip对象存储了一段声音&#xff0c;可用于播放音效、背景音乐和语音对白等 ambisonic参数指示该音频片段是否是立体混响声 二、Audio Source&#xff1a;音源 用于在场景中播放AudioClip ——相当于发出声音的物体或设备。…

网络安全实战,潜伏与Python反向连接

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程: Python网络安全项目开发实战_潜伏与Python反向连接_编程案例解析实例详解课程教程.pdf 在网络安全领域,潜伏与反向连接技术常被黑客用于绕过防火墙和…

收银系统源码-千呼新零售2.0【线上营销】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看&a…

Js逆向爬虫基础篇

这里写自定义目录标题 逆向技巧断点一 、请求入口定位1. 关键字搜索2. 请求堆栈3. hook4. JSON.stringify 二、响应入口定位&#xff1a;1. 关键字搜索2. hook3. JSON.parse 逆向技巧 断点 普通断点 条件断点 日志断点 XHR断点 一 、请求入口定位 1. 关键字搜索 key关…