1.正则表达式练习
'''
/d 匹配任意数字
/w 匹配任意字母 数字 下划线
. 匹配除了换行符任意字符
* 匹配0次或者更多次
^ 匹配行首
$ 匹配行尾
/D 匹配非数字
/W 匹配非数字非字母非下划线
/S 匹配任意非空白符
/s 匹配任意空白符 包括 换行符 Tab制表符 空格
[a-z] 匹配 a-z的所有字母
[0-9] 匹配0-9的所有数字
[\u4e00-\u9fa5] 中文编码范围
[^123a_z] 匹配除了 1 or 2 or 3 or a-z 以为的所有字符
$ 匹配行尾
? 匹配0次或者1次
+ 匹配至少1次或多次
{n,} 匹配n次 or 更多次
{n,m} 匹配n-m次
{n} 匹配n次
# 正则表达查找匹配方法
1.match() 从头匹配 匹配到字符结束 匹配一次
2.search() 全局匹配 匹配到字符结束 匹配一次
3.findall() 全局匹配 返回列表 匹配次数不限
4.finditer() 全局匹配 返回迭代器 是match对象 结果用 .group()方法获取
5.split() 切割字符串 返回列表
6.sub('新的字符串','旧的字符串') 替换方法
7.贪婪模式 : 尽可能多获取 .*
非贪婪模式: 尽可能少获取 .*? (常用)
8.匹配中文: 中文编码范围 [\u4e00-\u9fa5]
9.爬虫中万能的正则表达式
re.compile(r'<边界></边界>',re.S)
\d \w \D \W \S \s \b \B
. * + ^ $
{n,} {n,m} {n}
[0-9] [a-z] ^[a] [^abc123] 123|abc
'''
import re
# str='123hello123wlww'
# 正则表达
# pattern=re.compile('\d+')
# 使用匹配方法
# result=pattern.match(str)
# print(result.group())
# str='1j2j3j4p5oda6'
# pattern = re.compile('\w')
# result = pattern.match(str)
# # print(result)
# print(result.group())
# str = '1o2o3o4iuai53pojp235'
# pattern = re.compile('\D')
# result = pattern.search(str)
# print(result.group())
# str = '1o2o3o4iuai53pojp235'
# pattern = re.compile('\D')
# result = pattern.findall(str)
# print(result)
# res=result[0:5:2]
# print(res)
# str = '1o2o3o4iuai53pojp235'
# pattern = re.compile('\D')
# result = pattern.finditer(str)
# print(result) #返回迭代器
# for i in result:
# # print(i) #返回match对象
# print(i.group()) #打印结果
# str='ab,e1,31;v1e'
# pattern = re.compile(r'[,;]')
# result = pattern.split(str)
# print(result)
# str = 'hello 123 , world 456'
# pattern = re.compile(r'(\w+) (\d+)')
# result = pattern.sub('666world',str)
# print(result)
# str = '<div>python</div><div>java</div><div>web</div><div>UI</div>'
# pattern = re.compile(r'<div>(.*)</div>') #贪婪模式
# result = pattern.findall(str)
# print(result)
# pattern = re.compile(r'<div>(.*?)</div>') #非贪婪模式
# result = pattern.findall(str)
# print(result)
# str = 'qwer 我爱我的祖国 asdf'
# pattern = re.compile(r'[\u4e00-\u9fa5]')
# result = pattern.findall(str)
# print(result)
# re.compile(r'(.*?)' ,re.S) 万能公式
2.猫眼电影
# 需求:获取猫眼电影TOP100的电影信息(排名、电影名、演员、上映时间、评分)
import requests,re
# 定义参数
params={}
# 定义请求头
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'
}
# 响应数据
response = requests.get(url='https://maoyan.com/board/4',params=params,headers=headers)
# 定义规则 抓取dd列表所有信息
res = re.compile(r'<dd>(.*?)</dd>',re.S)
# 提取dd信息
result = res.findall(response.text)
#制定排名规则
paiming = re.compile(r'<i class="board-index board-index-\d+">(.*?)</i>')
#制定电影名规则
move_name = re.compile(r'<p class="name"><a .*?>(.*?)</a></p>',re.S)
# 制定演员规则
actor = re.compile(r'<p class="star">(.*?)</p>',re.S)
# 制定上映时间规则
time = re.compile(r'<p class="releasetime">(.*?)</p>',re.S)
#制定评分规则
sore = re.compile(r'<p class="score"><i class="integer">(.*?)</i><i class="fraction">(.*?)</i></p>',re.S)
#循环遍历
for dd in result:
#获取排名
print(dd)
pai = paiming.findall(dd)[0]
#获取电影名
m_name=move_name.findall(dd)[0]
# print(m_name)
#获取演员名字
a_name = actor.findall(dd)[0].strip()
# print(a_name)
#获取上映时间
a_time = time.findall(dd)[0]
# print(a_time)
#获取评分
s_sore = sore.findall(dd)[0]
ss_sore = s_sore[0] + s_sore[1]
# print(ss_sore)
3.淘宝电场
#需求: 获取淘宝电场中 7个楼层商品名称及价格
#网址 https://www.taobao.com/markets/3c/tbdc?spm=a21bo.2017.201867-main.11.5af911d9WqhgGA
# 需求:获取淘宝电场中,7个楼层的商品名称及价格
import requests,re,json
# 定义请求头
# headers = {
# 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36'
# }
# 发起请求,接收响应
# response = requests.get(url='https://www.taobao.com/markets/3c/tbdc?spm=a21bo.2017.201867-main.11.5af911d9WqhgGA',headers=headers)
# print(response.text)
# 发现问题:页面返回的内容没有我们想要的数据
# 原因:爬虫爬取的是网页源代码的信息,网页源代码中没有我们需要的数据
# 一楼:https://drc.alicdn.com/7/1870316_2____?callback=jsonp1870316_2____
# 二楼:https://drc.alicdn.com/7/1870321_2____?callback=jsonp1870321_2____
# 三楼:https://drc.alicdn.com/7/1870333_2____?callback=jsonp1870333_2____
# 四楼:https://drc.alicdn.com/7/1870340_2____?callback=jsonp1870340_2____
# 五楼:https://drc.alicdn.com/7/1870341_2____?callback=jsonp1870341_2____
# 六楼:https://drc.alicdn.com/7/1870342_2____?callback=jsonp1870342_2____
# 七楼:https://drc.alicdn.com/7/1870343_2____?callback=jsonp1870343_2____
# 找规律:发现没有规律
url1 = 'https://drc.alicdn.com/7/1870316_2____?callback=jsonp1870316_2____'
url2 = 'https://drc.alicdn.com/7/1870321_2____?callback=jsonp1870321_2____'
url3 = 'https://drc.alicdn.com/7/1870333_2____?callback=jsonp1870333_2____'
url4 = 'https://drc.alicdn.com/7/1870340_2____?callback=jsonp1870340_2____'
url5 = 'https://drc.alicdn.com/7/1870341_2____?callback=jsonp1870341_2____'
url6 = 'https://drc.alicdn.com/7/1870342_2____?callback=jsonp1870342_2____'
url7 = 'https://drc.alicdn.com/7/1870343_2____?callback=jsonp1870343_2____'
url_list = [url1,url2,url3,url4,url5,url6,url7]
# 定义请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36'
}
# 制定提取json数据的规则
json_pattern = re.compile(r'\((\{.*\})\)')
for url in url_list:
# 发起请求
response = requests.get(url=url,headers=headers)
json_data = json_pattern.findall(response.text)[0]
data_list = json.loads(json_data)['result']
for data in data_list:
# 获取价格
price = data['item_current_price']
# 获取商品名
name = data['item_title']
print(name,price)
4.股吧
#需求:获取热门第一页的所有数据(阅读、评论、标题、作者、更新时间)
import requests,re
from openpyxl import Workbook
wb=Workbook()
wbc=wb.active
wbc.append(['阅读','评论','标题','作者','更新时间'])
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'
}
response = requests.get(url='https://guba.eastmoney.com/default,0_1.html',headers=headers)
# print(response.text)
#制定提取li的规则
# res = re.compile(r'<ul class="newlist".*?>(.*?)</ul>',re.S)
res = re.compile(r'<ul class="newlist" tracker-eventcode="gb_xgbsy_lbqy_qblbdj">(.*?)</ul>',re.S)
result = res.findall(response.text)
li_pattern = re.compile(r'<li>(.*?)</li>', re.S)
li_list = li_pattern.findall(result[0])
#制定阅读规则
read = re.compile(r'<cite>(.*?)</cite>',re.S)
# 制定标题规则
title = re.compile(r'<span class="sub">.*<a .*>(.*?)</a></span>',re.S)
# 制定作者规则
font = re.compile(r'<font>(.*?)</font>',re.S)
# 制定更新时间规则
time = re.compile(r'<cite class="last">(.*?)</cite>',re.S)
# print(result)
for dd in li_list:
lst=[]
#获取阅读
r=read.findall(dd)[0].strip()
#获取评论
a=read.findall(dd)[1].strip()
# 获取标题
t_title = title.findall(dd)[0]
# print(t_title)
#获取作者
f_font = font.findall(dd)[0]
#获取更新时间
t_time =time.findall(dd)[0]
lst.append(r)
lst.append(a)
lst.append(t_title)
lst.append(f_font)
lst.append(t_time)
wbc.append(lst)
print(r,a,t_title,f_font,t_time)
wb.save('股吧.xlsx')