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'))

Python扫描器-爬虫基础的更多相关文章

  1. python从爬虫基础到爬取网络小说实例

    一.爬虫基础 1.1 requests类 1.1.1 request的7个方法 requests.request() 实例化一个对象,拥有以下方法 requests.get(url, *args) r ...

  2. Python BeautifulSoup4 爬虫基础、多线程学习

    针对 崔庆才老师 的 https://ssr1.scrape.center 的爬虫基础练习.Threading多线程库.Time库.json库.BeautifulSoup4 爬虫库.py基本语法

  3. 自学Python六 爬虫基础必不可少的正则

    要想做爬虫,不可避免的要用到正则表达式,如果是简单的字符串处理,类似于split,substring等等就足够了,可是涉及到比较复杂的匹配,当然是正则的天下,不过正则好像好烦人的样子,那么如何做呢,熟 ...

  4. Python归纳 | 爬虫基础知识

    1. urllib模块库 Urllib是python内置的HTTP请求库,urllib标准库一共包含以下子包: urllib.error 由urllib.request引发的异常类 urllib.pa ...

  5. 自学Python四 爬虫基础知识储备

    首先,推荐两个关于python爬虫不错的博客:Python爬虫入门教程专栏   和 Python爬虫学习系列教程 .写的都非常不错,我学习到了很多东西!在此,我就我看到的学到的进行总结一下! 爬虫就是 ...

  6. 自学Python五 爬虫基础练习之SmartQQ协议

    BAT站在中国互联网的顶端,引导着中国互联网的发展走向...既受到了多数程序员的关注,也在被我们所惦记着... 关于SmartQQ的协议来自HexBlog,根据他的博客我自己也一步一步的去分析,去尝试 ...

  7. python 网页爬虫 基础篇

    首先要连接自己的数据库 import pymysql import requests #需要导入模块 db = pymysql.connect('localhost', 'root', '****** ...

  8. Python爬虫基础

    前言 Python非常适合用来开发网页爬虫,理由如下: 1.抓取网页本身的接口 相比与其他静态编程语言,如java,c#,c++,python抓取网页文档的接口更简洁:相比其他动态脚本语言,如perl ...

  9. python 3.x 爬虫基础---Urllib详解

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 前言 爬虫也了解了一段时间了希望在半个月的时间内 ...

随机推荐

  1. Java与CC++交互JNI编程

    哈哈,经过了前面几个超级枯燥的C.C++两语言的基础巩固之后,终于来了到JNI程序的编写了,还是挺不容易的,所以还得再接再厉,戒骄戒躁,继续前行!! 第一个JNI程序: JNI是一种本地编程接口.它允 ...

  2. waitpid()

    waitpid() pid_t waitpid(pid_t pid, int *status, int options); 参数: pid>0 只等待进程ID等于pid的子进程,不管其它已经有多 ...

  3. 0006SpringBoot中@Configuration与@Bean联合使用

    需求:将某个普通类做为组件注册到容器中,可通过如下办法 1.定义HelloService类 package springboot_test.springboot_test.service; publi ...

  4. [转载]es6 Promise.resolve()方法

    es6 Promise.resolve()方法 2018-01-27 22:29:06 ixygj197875 阅读数 16925更多 分类专栏: ES6标准入门 (阮一峰) ES6标准入门   Pr ...

  5. FastDFS+Nginx+Module

    1.安装libevent wget  https://cloud.github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.g ...

  6. springboot与springMVC的关系

  7. .pid文件

    pid文件为进程文件,默认的在每个/var/run/目录下生成,当使用systemctl进行进程启动的时候,在这个目录下就会生成相应的pid文件,今天在进行poc测试的时候,对进程执行了enable操 ...

  8. bzoj2725

    * 给出一张图 * 每次删掉一条边后求 the shortest path from S to T * 线段树维护最短路径树 * 具体维护从某点开始偏离最短路而到达 T 的最小距离 * 首先记录下最短 ...

  9. [USACO5.5] 矩形周长Picture

    https://www.luogu.org/problemnew/show/P1856 1.每个矩形由两条横向边和两条纵向边组成. 2.对于横向边,按纵坐标排序.设当前讨论的边为 A [s , t] ...

  10. 我好菜系列——map查找

    链接:https://ac.nowcoder.com/acm/contest/931/A来源:牛客网 DNA序列里只有ACGT四种字母,A和T对应,C和G对应. 俩序列完全对应,就是指它们每一位上的字 ...