首页 > 其他 > 详细

爬虫基础

时间:2019-04-19 13:08:45      阅读:126      评论:0      收藏:0      [点我收藏+]

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

爬虫基础

原文:https://www.cnblogs.com/17bdw/p/10735127.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!