python 正则表达式以及爬虫初识

一.正则表达式

        正则表达式是一个很强大的字符串处理工具,几乎任何关于字符串的操作都可以使用正则表达式来完成,当然如果你是python

爬虫工作者每天跟字符串打交道,正则表达式更是不可或缺的技能,正则表达式在不同的语言中使用方式可能不太一样,不过只要

学会一门语言的正则表达式用法,其他也就只是换个函数的名称而已。下面列举正则中的一些符号的作用。

\d       表示:任意以为数字

\d\d     表示:任意的两位数字

\w       表示:任意的一个数字和字母

\s       表示:空格

.        表示:任意的内容

a.       表示:在a的后面匹配任意的内容

*        表示:前面的一个内容出现0到多次
        
a.*      表示:a后面的内容出现0到多次

+        表示:前面的一个内容这个内容出现0到一次

?        表示:前面的一个内......容和内容出现0到一次

^        表示:以.....开头

$        表示:以....结尾

{n}      表示:内容重复n次

\d{3}    表示:数字d重复3次

{n,m}    表示:最少重复n次,最多重复m次

\d{3,5}  表示:数字d最少重复3次,最多重复5次

{n,}     表示:最少重复n次

{,m}     表示:最多重复m次


。。。。。。。。。。。。。。。。。。。。。。。

2.上面只是一些正则的一些符号的含义及作用,下面来举一些例子:

#使用正则首先要引入正则要用的模块  在python中正则表达式的模式是可以同时使用多个的,
#在python  里面使用按位或运算符   ,| ,这个符号|  可以同时添加多个模式
#例如:re .compile('',re.I|re.M|re.S) 
*****************************************************
                          #match:匹配的内容是开始部分等同于startswitch
*****************************************************
improt re
#pattern:模式  compile:编译  match:匹配

pattern = re.compile('(\d+)')
content = '123asdfnmsfi'
#后面写的是正则表达式的内容()代表从目标字符串当中获取的子串
result= re.match(pattern,content)
if result:
    #返回的是一个匹配的对象
    print(result)
    print('**************')
    #返回的是所有符合要求的全部内容
    print(result.group(0))
    print(result.group(1))
else:
    print('不符合')
    
        

运行结果如下:

pattern = re.compile('my')
result = re.match(pattern,'myself')#括号内对象和内容
print(result.group(0))

 

pattern =re.compile('lalala')
result = re.match(pattern,'halalalaha')
print(result)

pattern = re.compile('my')
result = pattern.match('myself')
print(result)



*****************************************************
                          #match:匹配的内容是开始部分等同于startswitch
*****************************************************

 3.贪婪模式与非贪婪模式

   正则表达式默认为贪婪模式即便找到所有的符合要求的内容

.*   :称之为贪婪模式

content = "aabbabab11v222"
pattern = re.compile('(a.*b)')
result =pattern.match(content)
print(result)
 

.*? :称之为非贪婪模式

content = "aabbabab11v222"
pattern= re.compile('(a.*?b)')
result = pattern.match(content)
print(result)

 

 匹配以任意字符开头后面找到一个以b开头以b结尾的内容

content = "aabbabab11v222"
pattern = re.compile('.*?(b.*?b)')
result = pattern.match(content)
print(result)

 

*+ :同为贪婪模式

content = "aabbabab11v222"
pattern = re.compile('(a.+b)')
result =pattern.match(content)
print(result)

4.search:查找  找到字符串当中第一个符合正则的内容,只找到一个

pattern = re.compile(r'http')
result=pattern.search('www.jd.com,http://www.taobao.com')
print(result)

pattern = re.compile(r'you')
result=pattern.search('l love you ,l like you')
print(result)

findall:找到所有符合的内容

content= '12345,上山打老虎,老虎没打着,打只小松鼠,556895555'
pattern = re.compile(r'\d{5}')
result = pattern.findall(content)
print(result)

sub:替换子串  

content = '杨过对战金轮法王,郭靖观战'
pattern = re.compile(r'杨过')
result = pattern.sub('吕布',content)
print(result)


pattern = re.compile(r'^((13[0-9])|(14[67])|(15[0-3])|(15[5-9])|(18[0|5-9]))\d{8}$')
result=pattern.match('15786421053')
print(result)

 

 

import re
content = """
today is hot , I
want sleep , I
want go home
"""

pattern = re.compile(r'.*? I(.*?)sleep')
result = pattern.search(content)
print(result)
# re.S 忽视换行符号
pattern = re.compile(r'.*? I(.*?)sleep',re.S)
result = pattern.search(content)
print(result)

二:爬虫

      什么是爬虫?

如果把互联网比喻成一张蜘蛛网,我们抓取互联网信息的程序就像是游走在蜘蛛网上的蜘蛛,称之为爬虫

   爬虫有什么作用呢?

①:获取信息,填充数据到自己的服务器

②:爬取关键信息,进行商业分析市场评估

③:浏览器

   爬虫的分类:

①通用爬虫:全部获取

②聚焦爬虫:只获取自己想要的

   爬虫准备:

①:Firefox,google

②Charles

③\了解http通信协议以及数据请求过程

    互联网之http协议

http

HTTPS

http://www.baidu.com

http后面的是域名,而域名的实质:ip地址

举个例子:

http://www.apiopen.top/weatherApi?city=上海

协议+域名/ip+路径   以?分割     ?后面的是参数    参数又以等号分割

等号前面的是参数名   后面的是参数值

参数与参数之间又以&隔开

DNS  域名系统将ip地址和域名对应起来

ipv4 : 四组3位数字组成

ip分类:

静态ip

动态ip

ipv6

服务器分类:

1.硬件服务器:理论上任何电脑都可以当做成一个服务器

2.软件服务器:服务器代码

http请求的特点:

1.数据类型比较广泛     json/text/xml/html/data

2.请求是无状态协议的,这次的请求和上次的请求没有任何关系

请求完之后  服务器和客户端的链接会断掉

socket     保持长连接,请求以后服务器和客户端的链接不会断掉

3.http有请求报文和响应报文

请求报文:①:请求行http://www.apiopen,top/weatherApi?city=

②请求头:里面有个User-Agent:标识目标(通过什么方式来访问对象)

host :主机

connection :服务器和客户端之间的链接状态

③:请求体:参数:上海   在请求里面放参数

响应报文:

①状态行

②响应头

③响应体:请求数据就是为了得到响应体

4.http请求方法

method(post,get,delete)

post:可以对数据进行增删改查

get:可以对数据进行增删改查

get和post的区别:

1.get的参数是放到url的后面,是暴露的

post的参数是放在请求体当中,是隐藏的

2.url的长度大小不能超过1kb

get将所有想要的 发送到服务器的内容都放到url中

上传文件要使用post方法

现在就拿百度来做个例子

from urllib.request import Request,urlopen
from prettyprinter import pprint
# urlopen:不支持中英文混写
# urlopen(url)  不能直接这样写
url='http://www.baidu.com'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
# 替换程序的User-Agent
request=Request(url,headers=headers)
response=urlopen(request)
# decode:解码  encode:编码
print(response.read().decode())

输入以上代码会得到百度的首页源码

爬虫/反爬流程

1.判断是否是python urllib      (判断禁止爬虫)解决办法: 伪装成User-Agent进行爬虫

2.判断同一个User-Agent  是否多次访问     解决办法:换成不同的User-Agent进行访问

3.判断同一个ip是否多次访问     解决办法:使用不同的ip进行访问

下面就举个例子:

ip代理链接地址

import random
from urllib.request import Request,urlopen,ProxyHandler,build_opener

user_agent_list=['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
                 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:61.0) Gecko/20100101 Firefox/61.0']
headers = {
    'User-Agent':random.choice(user_agent_list)
}
ip_list=['61.135.217.7:80',
         '61.135.217.7:80',
         '61.135.217.7:6666'
        ]
# proxies:代理
proxies={
    'http:':random.choice(ip_list)
}
# 设置爬虫目标  以及用户标识
request = Request('http://www.baidu.com',headers=headers)
# 创建ip代理对象
proxy_handler=ProxyHandler(proxies)
# urlopen不支持http高级函数,cookie,验证,代理等内容
# 如果要使用这些内容的话,需要使用build_opener对象进行处理
opener = build_opener(proxy_handler)
response = opener.open(request)
print(response.read().decode())

猜你喜欢

转载自blog.csdn.net/crq_zcbk/article/details/81408235