欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python爬虫第三天

程序员文章站 2022-06-18 08:18:56
DebugLog实战 有时候我们需要在程序运行时,一边运行一边打印调试日志。此时需要开启DebugLog。 如何开启: 首先将debuglevel设置为1,然后用urllib.request.build_opener()创建自定义对象opener将debuglevel作为参数传入接着用urllib. ......
 
 
debuglog实战
        有时候我们需要在程序运行时,一边运行一边打印调试日志。此时需要开启debuglog。
        如何开启:
        首先将debuglevel设置为1,然后用urllib.request.build_opener()创建自定义对象opener将debuglevel作为参数传入接着用urllib.request.install_opener()创建全局默认对象opener,进行后续操作。
import urllib.request
#复制区-----
httphd=urllib.request.httphandler(debuglevel=1)
httpshd=urllib.request.httpshandler(debuglevel=1)
opener=urllib.request.build_opener(httphd,httpshd)
urllib.request.install_opener(opener)
#-----复制区
data=urllib.request.urlopen("http://edu.51cto.com")
这样就可以边执行程序边打印调试log日志。
 
异常处理神器——urlerror实战
    如何合理的处理异常:介绍两个类
        urlerror和他的一个子类httperror
实例1:
import urllib.request
import urllib.error
try:
    urllib.request.urlopen("http://blog.csdn.net")
except urllib.error.urlerror as e: #这里csdn禁止对文章爬取,所以没有模拟浏览爬会出现403错误
#由于触发了httperror产生的urlerror异常,这里使用httperror替换亦可以,
#但是httperror不能处理:连接不上服务器,远程url不存在、无网络的异常
    print(e.code)
    print(e.reason)
补充知识:状态码
200----一切正常
301----重定向到新的url,永久性
302----重定向到临时的url,非永久性
304----请求的资源未更新
400----非法请求
401----请求未经授权
403----禁止访问
404----没有找到对应页面
500----服务器内部出现错误
501----服务器不支持实现请求所需要的功能
实际上我们处理异常不知道使用httperror能不能处理。我们可以进行优化,先让httperror处理,不行再让urlerror处理
代码如下:
try:
    urllib.request.urlopen("http://blog.baidusss.net")#不存在的网址
except urllib.error.httperror as e:
    print(e.code)
    print(e.reason)
except urllib.error.urlerror as e:
    print(e.reason)
 
代码再改进,整合一下:不管何种原因都可以解决
try:
    urllib.request.urlopen("http://blog.csdn.net")
except urllib.error.urlerror as e:
    if hasattr(e,"code"):
        print(e.code)
    if hasattr(e,"reason"):
        print(e.reason)
 
正则表达式入门
    正则表达式就是描述字符串排列的一套规则。比如电子邮件、手机号的字符都是满足一定的规则的,我们可以用正则来表达他们的格式。在python中我们用re模块来实现正则。
    基础知识:
 no1 、原子:正则的基本组成单位,每个正则中至少包含一个原子。
    原子的类型:
            1:普通字符
import re
pattern="yue"
string="http://yum.iqianyue.com"
result1=re.search(pattern,string)
print(result1)
#结果:<_sre.sre_match object; span=(16, 19), match='yue'>
这里我们匹配两个字符串,成功匹配到了字符结果“yue”         
 
   2:非打印字符 
        指在一些字符串中用于格式控制的符号,如:
 
符号 含义
\n 用于匹配一个换行符
\t 用于匹配一个制表符
import re
 
pattern="\n"
string='''http://yum.iqianyue.com
http://baidu.com'''
result=re.search(pattern,string)
print(result)
 
 
            3:通用字符 
一个原子可以匹配一类字符
 
符号
含义
\w
匹配任意一个字母、数字或下划线
\w
匹配除字母、下划线、数字以外的任意字符
\d
匹配任意一个十进制数
\d
匹配十进制以外的任意一个其他字符
\s
匹配任意一个空白字符
\s
匹配除空白字符以外的任意一个其他字符
 
          
pattern="\w\dpython\w"
string="abcdfphp345python_py"
result=re.search(pattern,string)
print(result)
#结果<_sre.sre_match object; span=(9, 18), match='45python_'>
 
 
 
  4:原子表
 
使用原子表定义一组地位相等的原子,匹配是会取原子表中任意一个原子进行匹配,在python中原子表用[]表示
如[xyz]对应源字符是“xpython”如果用re.search匹配,就可以匹配到“xpy”,因为只要py的前一位是xyz的任一个原子就可以匹配成功
 
    
pattern1="\w\dpython[xyz]\w"
string="abcdfphp345pythony_py"
result=re.search(pattern1,string)
print(result)
#结果:<_sre.sre_match object; span=(9, 19), match='45pythony_'>
 
 
 此文是我在学习《精通python网络爬虫》(韦玮著)的总结,纯手打。