python爬虫二

2.1正则表达式

1.正则表达式:对文本字符串进行检索、筛选的一种规则形式
详细内容,参照链接帖:
正则表达式测试验证工具:https://tool.oschina.net/regex
2.贪婪匹配和惰性匹配:
例:一个字符串 “abcdacsdnd”

①懒惰匹配

    regex = "a.*?d"

②贪婪匹配

    regex = "a.*d"

测试代码:
# coding=UTF-8
import re

str = "abcdacsdn"
print("原始字符串  " + str)

# 懒惰匹配
regexL = "a.*?d"
print("懒惰匹配 = " + regexL)
regL = re.compile(regexL)
listL = re.findall(regL, str)
print("懒惰匹配结果")
print(listL)

# 贪婪匹配
regexT = "a.*d"
print("贪婪匹配 = " + regexT)
regT = re.compile(regexT)
listT = re.findall(regT, str)
print("贪婪匹配结果")
print(listT)

测试结果:
在这里插入图片描述
结果分析:

    懒惰匹配,匹配成功两次,一次abcd,一次acsd,匹配到满足条件的abcd就停止了此次匹配,不会干扰后面的继续匹配。

    贪婪匹配,匹配成功一次,只有abcdacsd,匹配到字符串后,会最大限度的占用字符串

以上两种,一个是尽量匹配最短串,一个是匹配最长串

2.2PYTHON re模块

import re

# findall():匹配字符串中所有的符合正则的内容
lst=re.findall(r"\d+","我的电话号码是:10086,我女朋友的电话是:10010")
'''1.返回值类型为list
   2.字符串前加"r"防止转义
'''
print(lst)
print(type(lst))


# finditer:匹配字符串中所有的内容[返回的是迭代器],从迭代器中拿到内容需要.group()
it=re.finditer(r"\d+","我的电话号码是:10086,我女朋友的电话是:10010")
for i in it :
    print(i.group())


#search:全文匹配找到一个结果就返回,返回的数据类型为match对象,拿数据需要.group()
s=re.search(r"\d+","我的电话号码是:10086,我女朋友的电话是:10010")
print(s.group())


#match:只能从头开始匹配,此处类似于"^\d+"
# s=re.match(r"\d+","我的电话号码是:10086,我女朋友的电话是:10010")
# print(s.group())
print("3")

#预加载正则表达式
obj=re.compile(r"\d+")
ret=obj.finditer("我的电话号码是:10086,我女朋友的电话是:10010")
for it in ret:
    print(it.group())

print("4")
ret=obj.findall("我的电话号码是:10086,我女朋友的电话是:10010")
print(ret)

s="""
<div class='as'><span id='1'>tg</span></div>
<div class='zx'><span id='2'>rf</span></div>
<div class='qw'><span id='3'>cd</span></div>
<div class='er'><span id='4'>nh</span></div>
"""
#(?P<分组名字,不能为数字!!>正则) 可以单独从正则匹配的内容中提取到信息
obj=re.compile(r''''''<div class='.*?'><span id='(?P<qwe>\d+)'>(?P<asd>.*?)</span></div>",re.S)
result=obj.finditer(s)
for it in result:
    print(it.group("asd"))
    print(it.group("qwe"))
   

2.3手刃豆瓣top250电影排行榜

import csv

import requests
import re

url = "https://movie.douban.com/top250"

headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
}
resp = requests.get(headers=headers, url=url)
page = resp.text
#print(resp.text)
resp.close()

# re解析
obj = re.compile(r'''<li>.*? <span class="title">(?P<name>.*?)</span>
                 .*?<p class="">.*?导演: (?P<director>.*?)&nbsp''' , re.S)
result = obj.finditer(page)
f=open("data.csv",mode="w",encoding="utf-8")
csvwriter=csv.writer(f)
for it in result:
    #print(it.group("name"))
    dic=it.groupdict()
    #dic['year']=dic['year'].strip()
    csvwriter.writerow(dic.values())
f.close()
print("over")

2.4爬取电影天堂


```python
import requests
import re
import urllib3
urllib3.disable_warnings()  #关闭系统提示主动发送链接请求警告

#打开网站首页,筛选电影子链接
domain="https://www.dytt8.net/index2.htm"
resp=requests.get(domain,verify=False) #verify=False关闭防火墙
resp.encoding='gb2312'
#print(resp.text)
text=resp.text
resp.close()

obj1=re.compile(r'最新电影下载</a>](?P<self_domain>.*?)</a>.*?',re.S)
obj2=re.compile(r"<a href='(?P<href>.*?)'>",re.S)
lst=[]
result1=obj1.finditer(text)
for it in result1:
    data1=it.group('self_domain')
    result2=obj2.finditer( data1)
    for itt in result2:
        index="https://www.dytt8.net" + itt.group('href')   #将子链接和首页网址进行拼接拿到完整子链接
        lst.append(index)
        #print(lst)   将子链接添加到一个列表当中

#依次遍历列表中的子链接并且进行信息甄选
obj3=re.compile(r"◎简  介<br /><br />(?P<introduction>.*?)<br /><br /><br />",re.S)
for href in lst:
    child_resp=requests.get(href,verify=False)
    child_resp.encoding="gb2312"
    result3=obj3.finditer(child_resp.text)
    for ittt in result3:
        print(ittt.group('introduction'))


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值