首页 > 编程语言 > 详细

python爬虫

时间:2021-05-15 20:20:59      阅读:26      评论:0      收藏:0      [点我收藏+]

爬虫概念:按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
                  通俗的来说就是:就是爬虫可以模拟浏览器的行为做你想做的事,订制化自己搜索和下载的内容,并实现自动化的操作。


爬虫实现: 实现爬虫技术的编程环境有很多种,Java,Python,C++等都可以用来爬虫

爬虫学习知识点:
1、首先学会基本的Python语法知识
2、学习Python爬虫常用到的几个重要内置库urllib, http等,用于下载网页
3、学习正则表达式re、BeautifulSoup(bs4)、Xpath(lxml)等网页解析工具
4、开始一些简单的网站爬取(博主从百度开始的,哈哈),了解爬取数据过程
5、了解爬虫的一些反爬机制,header,robot,时间间隔,代理ip,隐含字段等
6、学习一些特殊网站的爬取,解决登录、Cookie、动态网页等问题
7、了解爬虫与数据库的结合,如何将爬取数据进行储存
8、学习应用Python的多线程、多进程进行爬取,提高爬虫效率
9、学习爬虫的框架,Scrapy、PySpider等
10、学习分布式爬虫(数据量庞大的需求)

一个请求过程在浏览器输入网址搜索后----->DNS服务器进行域名解析----->找到对应服务器并通过GET或POST方法请求数据----->
-       ---->若请求成功,我们就得到了我们想看到的网页----->
                        ---->若请求不成功,服务器会返回给我们请求失败的状态码,常见到的503,403等
爬虫的原理就是模拟这样一个操作


python请求:urllib库:向服务器发出请求并获得网页的功能
Python2.x中使用的urllib2和urllib库,而Python3.x中合并成一个唯一的urllib库。
python属性:error,parse,request,response。

1、Error:“Exception classesraised by urllib.”----就是由urllib举出的exception类
2、Parse:“Parse (absolute andrelative) URLs.”----解析绝对和相对的URLs
3、Request:“An extensiblelibrary for opening URLs using a variety of protocols”
----用各种协议打开URLs的一个扩展库
4、Response:“Response classesused by urllib.”----被urllib使用的response类

 

一个简单例子:获取python网页

import urllib.request
response = urllib.request.urlopen(http://python.org/)
result = response.read().decode(utf-8)
print(result)

 

其中urlopen方法

def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TI
MEOUT,*, cafile=None, capath=None,
cadefault=False, context=None):

参数介绍:
url:即是我们输入的url网址,(如:http://www.xxxx.com/);
data: 是我们要发给服务器请求的额外信息(比如登录网页需要主动填写的用户信息)。如果需要添加data参数,
            那么是POST请求,默认无data参数时,就是GET请求;
            一般来讲,data参数只有在http协议下请求才有意义
           data参数被规定为byte object,也就是字节对象
           data参数应该使用标准的结构,这个需要使用urllib.parse.urlencode()将data进行 转换,
           而一般我们把data设置成字典格式再进行转换即可;data在以后实战中会介绍如何使用
timeout:是选填的内容,定义超时时间,单位是秒,防止请求时间过长,不填就是默认的时间;
cafile:是指向单独文件的,包含了一系列的CA认证 (很少使用,默认即可);
capath:是指向文档目标,也是用于CA认证(很少使用,默认即可);
cafile:可以忽略
context:设置SSL加密传输(很少使用,默认即可);

打开链接后其他操作:

geturl(): 返回URL,用于看是否有重定向。
result = response.geturl()
结果: https://www.python.org/

 

info():返回元信息,例如HTTP的headers。
       result = response.info()
结果:
x-xss-protection: 1; mode=block
X-Clacks-Overhead: GNU Terry Pratchett
...
Vary: Cookie
Strict-Transport-Security: max-age=63072000;includeSubDomains

 

getcode():返回回复的HTTP状态码,成功是200,失败可能是503等,可以用来检查代理IP的可使用性。
result = response.getcode()
结果:200

 

Request方法
class Request:
      def __init__(self, url, data=None, headers={},origin_req_host=None, unverifiable=False,method=None):


参数介绍:
url,data和上面urlopen中的提到的一样。
headers是HTTP请求的报文信息,如User_Agent参数等,它可以让爬虫伪装成浏览器而不被服务器发现你正在使用爬虫。
origin_reg_host, unverifiable, method等不太常用

 


headers很有用,有些网站设有反爬虫机制,检查请求若没有headers就会报错,
因此为保证爬虫的稳定性,基本每次都会将headers信息加入进去,这是反爬的简单策略之一
技术分享图片

 

 

import urllib.request
headers = {User_Agent: ‘‘}
response = urllib.request.Request(http://python.org/, headers=headers)
html = urllib.request.urlopen(response)
result = html.read().decode(utf-8)
print(result)

 

 

error的使用:error属性里面主要包括了两个重要的exception类,URLError类和HTTPError类。

1. URLError类

def __init__(self, reason, filename=None):
    self.args = reason,
    self.reason = reason
    if filename is not None:
        self.filename = filename
URLError类是OSError的子类,继承OSError,没有自己的任何行为特点,但是将作为error里面所有其它类型的基类使用。
URLError类初始化定义了reason参数,意味着当使用URLError类的对象时,可以查看错误的reason。
2. HTTPErro类

def __init__(self, url, code, msg, hdrs, fp):
    self.code = code
    self.msg = msg
    self.hdrs = hdrs
    self.fp = fp
    self.filename = url
HTTPError是URLError的子类,当HTTP发生错误将举出HTTPError。
HTTPError也是HTTP有效回应的实例,因为HTTP协议错误是有效的回应,包括状态码,headers和body。所以看到在HTTPError初始化的时候定义了这些有效回应的参数。
当使用HTTPError类的对象时,可以查看状态码,headers等

 

案例1:
import urllib.request
import urllib.error
try:
    headers = {User_Agent: Mozilla/5.0 (X11; Ubuntu; 
                Linux x86_64; rv:57.0) Gecko/20100101 
                Firefox/57.0}
    response = urllib.request.Request(http://python.org/, 
                                       headers=headers)
    html = urllib.request.urlopen(response)
    result = html.read().decode(utf-8)
except urllib.error.URLError as e:
    if hasattr(e, reason):
        print(错误原因是 + str(e.reason))
except urllib.error.HTTPError as e:
    if hasattr(e, code):
        print(错误状态码是 + str(e.code))
else:
    print(请求成功通过。)

 

 

 

 本文转载:https://segmentfault.com/a/1190000012681700

 

 

 

 

 

 

 

 

 






python爬虫

原文:https://www.cnblogs.com/1314520xh/p/14769702.html

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