Python扫描器-爬虫基础
0x1、基础框架原理
1.1、爬虫基础
爬虫程序主要原理就是模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中
1.1、基础原理
- 1、发起HTTP请求
- 2、获取响应内容
- 3、解析内容
解析html数据
解析json数据
解析二进制数据
4、保存数据(数据库、文件)
1.2、发起HTTP请求-Request
- 1、HTTP请求方法:
常用的请求方法:GET,POST
其他请求方法:HEAD,PUT,DELETE,OPTHONS
- 2、请求URL
Web上每种可用的资源,如 HTML文档、图像、视频片段、程序等都由一个通用资源标志符(Universal Resource Identifier, URI)进行定位。
URI通常由三部分组成:
①访问资源的命名机制;
②存放资源的主机名;
③资源自身 的名称,由路径表示。
如下面的URI:
http://www.why.com.cn/myhtml/html1223/
我们可以这样解释它:
①这是一个可以通过HTTP协议访问的资源,
②位于主机 www.webmonkey.com.cn上,
③通过路径“/html/html40”访问。
- 3、请求头
User-agent:请求头中如果没有user-agent客户端配置,服务端可能将你当做一个非法用户
host : 主机头
cookies:cookie用来保存登录信息
- 4、请求体
get方式,请求体没有内容
post方式,请求体是format data
1.3、获取响应内容-Response
- 1、响应状态
200:代表成功
301:代表跳转
404:文件不存在
403:权限
502:服务器错误
- 2、Respone header
set-cookie:告诉浏览器,把cookie保存下来
- 3、preview就是网页源代码
最主要的部分,包含了请求资源的内容如网页html,图片、二进制数据等
1.4、练手库-Urllib
下载页面
三行代码下载一个页面
import urllib.request
response = urllib.request.urlopen('https://www.wikipedia.org')
print(response.read())
变量html包含html格式的网页数据。
模拟Web浏览器
Web浏览器把浏览器名称、版本与请求一起发送,这称为用户代理。Python可以使用下面的代码模仿这种方式。User-Agent字符串包含Web浏览器的名称和版本号:
import urllib.request
headers = {}
headers['User-Agent'] = "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:48.0) Gecko/20100101 Firefox/48.0"
req = urllib.request.Request('https://arstechnica.com', headers = headers)
html = urllib.request.urlopen(req)
print(html.read())
提交数据-GET
与GET请求一起传递的参数是通过附加到URL末尾的查询字符串完成的,因此添加参数不需要任何特殊函数或类,需要做的事情就是确保查询字符串正确编码和格式化。
创建包含在查询字符串中的键值对,可以创建一个字典对象,然后使用urllib.parse模块中包含的urllib的urlencode()函数对该对象进行编码和格式化。
import urllib.request
import urllib.parse
url = "http://example.com"
params = {
"param1": "arg1",
"param2": "arg2",
"param3": "arg3"
}
query_string = urllib.parse.urlencode( params )
url = url + "?" + query_string
with urllib.request.urlopen( url ) as response:
response_text = response.read()
print( response_text )
提交数据-POST
创建一个字典来存储POST参数的键值对,然后使用urlencode()进行格式化。格式化字符串编码为字节并指定所需的字符编码 。然后使用urlopen()正常打开请求,添加数据作为额外的参数,将请求类型更改为POST(默认为GET) ,其中3个参数会附加到请求正文
import urllib.request
import urllib.parse
url = "http://example.com"
params = {
"param1": "arg1",
"param2": "arg2",
"param3": "arg3"
}
query_string = urllib.parse.urlencode( params )
data = query_string.encode("ascii")
with urllib.request.urlopen(url,data) as response:
response_text = response.read()
print(response_text)
遇到的问题-SSL需要验证
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'hao123.com'. (_ssl.c:1051)>
解决方案
import ssl
import urllib.request
context = ssl._create_unverified_context()
html = urllib.request.urlopen('https://hao123.com/', context=context)
print(html.read().decode('utf-8'))
最新文章
- Hbase1.0 客户端api
- Dede cms文章内容管理系统安全漏洞!如何有效防止DEDE织梦系统被挂木马安全设置
- iOS图片压缩
- C#Graphics画图
- Load PE from memory(反取证)(未完)
- 用Chrome开发者工具做JavaScript性能分析
- 网格视图(GridView)功能和用法
- 【转载】doxygen+graphviz生成代码文档
- 通过grub-install命令把grub安装到u盘
- PHP Array 简介
- unity插件各领域王者
- 开源CMS系统Moodle对比中国本土化开源在线教育平台EduSoho
- JMeter实现Oracle参数化(1)
- 【题解】Luogu P3287 [SCOI2014]方伯伯的玉米田
- 前端学习 之 Bootstrap (一)
- 【java】一维数组
- 《linux内核》课本第五章读书笔记
- SPSS-两变量相关性分析
- Swing教程
- 【图解】javaScript组成结构
热门文章
- 前端笔记-css
- JDK源码那些事儿之HashMap.TreeNode
- asp.net core 读取appsettings.json配置项
- BZOJ 4864: [BeiJing 2017 Wc]神秘物质 (块状链表/平衡树 )
- .Net Core:Middleware自定义中间件
- Vue中用props给data赋初始值遇到的问题解决
- wamp大文件上传
- [Luogu] 软件包管理器
- [Luogu] 遥远的国度
- LOJ2341. 「WC2018」即时战略 [动态点分治]