【爬虫】三、数据解析之re解析正则表达式+爬取京东商城和电影天堂

re解析(正则表达式 )

从超长字符串中提取相应的内容。
优点:速度快、效率高、准确率高。
缺点:上手难。
语法:使用元字符进行排列组合匹配字符串。

元字符:具有固定含义的特殊符号。
常用元字符
在这里插入图片描述
量词:控制元字符出现的次数。
在这里插入图片描述
贪婪匹配:. 即尽可能多的匹配内容。
惰性匹配:.*? 即尽可能少的匹配内容。
*

import re

# findall:匹配字符串中的符合正则表达式的内容,但效率低
lst = re.findall(r"\d+","第一:10010,第二:10086")  #第一个参数为正则表达式(前面的r用于规范化),第二个参数为内容
print(lst)

# finditer:匹配字符串中所有的内容,返回迭代器,从迭代器拿到内容需要结果.group()
it = re.finditer(r"\d+","第一:10010,第二:10086")
print(it)
print("----------")
for i in it:
    print(i)
    print(i.group())    #用group取匹配到的内容

print("----------")
# search:全文匹配,只要检索有一个就返回match对象,用结果.group()显示
s = re.search(r"\d+","第一:10010,第二:10086")
print(s.group())


print("----------")
# match:从头匹配,有就返回match对象,用结果.group()显示,头不是就返回none
m = re.match(r"\d+","10010,第二:10086")
print(m.group())

print("----------")
#预加正则表达式
# obj = re.compile(r"\d+")  #可反复使用
#
# ret = obj.finditer("第一:10010,第二:10086")
# for j in ret:
#     print(j.group())

s = """
    <div class='jay'><span id='1'>周杰伦</span></div>
    <div class='jj'><span id='2'>林俊杰</span></div>
    <div class='jolin'><span id='3'>蔡依林</span></div>
    <div class='jk'><span id='4'>林依晨</span></div>
"""

# (?P<分组名字>正则表达式)  单独提取出某内容到分组中
# obj = re.compile(" <div class='.*?'><span id='.*?'>.*?</span></div>",re.S) #表示包括换行符在内的任意字符
obj = re.compile(" <div class='.*?'><span id='.*?'>(?P<name>.*?)</span></div>",re.S) # (?P<name>.*?) 表示.*?取出的值存分组name中

ret = obj.finditer(s)
for its in ret:
    print(its.group())
    print(its.group("name"))

例子:爬京东商城

import requests
import re
import csv

def getPage_content(page):
    url = "https://search.jd.com/Search?keyword=手机pvid=f7d4325adc364c5aa375cbf619c218c6&page="+str(page)+"&s=116&click=0"
    header={"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
    resp = requests.get(url,headers=header)
    page_content = resp.text
    resp.close()
    return page_content

def parse_page(page_content):
    #解析数据
    obj = re.compile(r'<div class="p-price">.*?<i data-price=".*?">(?P<price>.*?)</i>'
                     r'.*?<div class="p-name p-name-type-2">.*?<em>(?P<name>.*?)<'
                     r'.*?<span class="J_im_icon">.*?title=".*?">(?P<shopName>.*?)</a>',re.S)
    result = obj.finditer(page_content)
    return result

if __name__=='__main__':

    f = open("phone.csv",mode='w',encoding='utf-8',newline="")
    csvwriter = csv.writer(f)
    for page in range(1,3):
        page_content = getPage_content(page)
        result = parse_page(page_content)
        for it in result:
            # print(it.group("name"))
            # print(it.group("price"))
            # print(it.group("shopName"))
            # print(it.group("discounts1"))
            # print(it.group("discounts2"))
            # print("--------------------")
            dic = it.groupdict()
            csvwriter.writerow(dic.values())
    f.close()

例子:爬电影天堂

import requests
import re
import csv

url = 'https://www.dytt8.net/index2.htm'
resp = requests.get(url)
# 手动设定响应数据的编码格式
resp.encoding = resp.apparent_encoding
page_content = resp.text
resp.close()

obj = re.compile(r'<div class="title_all"><p><strong>2023新片精品.*?<ul>(?P<ul>.*?)</ul>',re.S)
obj2 = re.compile(r"</a>]<a href='(?P<href>.*?)'>",re.S)
obj3 = re.compile(r'◎译  名 (?P<tname>.*?)<br />◎片  名 '
                  r'(?P<name>.*?)<br />.*?<a target="_blank" href="(?P<mlink>.*?)"><strong>',re.S)
result = obj.finditer(page_content)

domain = "https://www.dytt8.net"

linkList = []
for it in result:
    ul = it.group("ul")
    movies = obj2.finditer(ul)
    for it2 in movies:
        link = domain+it2.group("href")
        linkList.append(link)

f = open("movie.csv",mode='w',encoding='utf-8',newline="")
csvwriter = csv.writer(f)

for href in linkList:
    herfResp = requests.get(href,verify=False)
    herfResp.encoding = 'gb2312'  #设置编码charset
    # print(herfResp.text)
    downloadDic = obj3.search(herfResp.text).groupdict()
    csvwriter.writerow(downloadDic.values())
    herfResp.close()
f.close()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值