爬虫案例(三)

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')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值