python-16-正则表达式,简单爬虫,爬取电影网站连接到数据库

  • 正则表达式

导入模块 import re
匹配
re.match(‘正则表达式’,‘匹配的内容’) ---------------从头开始匹配返回对象
re.search(‘正则表达式’,‘匹配的内容’) ---------------字符串内查找模式匹配,只要找到第⼀个匹配然后返回对象
re.findall(‘正则表达式’,‘匹配的内容’) ----------------查找所有相匹配的内容返回结果
re.sum(‘正则表达式’,‘替换的内容’,‘匹配的内容’)--------------------查找完后将结果进行替换并返回结果
/match()函数只检测RE是不是在string的开始位置匹配,search()会扫描整个string查找匹配;
也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,
match()就返回none\ /

  • 分组

正则表达式中,用 () 来进行分组
group(1)表示正则表达式中第一个括号匹配到的内容
group(2)表示正则表达式中第二个括号匹配到的内容
依次类推…

  • 匹配符号
    python-16-正则表达式,简单爬虫,爬取电影网站连接到数据库_第1张图片

python-16-正则表达式,简单爬虫,爬取电影网站连接到数据库_第2张图片
在这里插入图片描述

  • 转义符 \

\. :对.进行转义,使其意义就是.,而不是任意一个字符
\’:对 ’ 进行转义
r模式 :识别正则表达式中的所有 \ ,使其意义就是 \,而不是转义。

  • 应用案例 结合mysql ----- 爬电影网站的影片下载地址
  • 准备工作-------------------------------------------------------------------------------------------------
  • 首先打开mysql服务
  • 然后创建movie_db 数据库
  • 然后进到movie_db 数据库中穿件 movie_link 数据表,字段为 id, film_name,film_link
  • 可以去电影网站看格式,参考飘花电影网站的一个片种,----》飘花电影首页----》动作片
  • 动作片的网址即为我们寻找的保存电影列表的网址,应用在我们第一个正则表达式匹配的内容,匹配出该页中所有电影名详情页。
import  urllib.request                # 这个模块是来打开网站并保存网站对象
import  re
import pymysql                        # 连接mysql数据库模块

def get_link():                       # 获取电影名和电影地址
    web_obj=urllib.request.urlopen('https://www.piaohua.com/html/dongzuo/index.html')
    web_data=web_obj.read()                                      # 读取网站中的所有源码
    web_text=web_data.decode()                                   # 将源码编译
    download_list=re.findall('正则表达式1',web_text)              #  正则表达式匹配网站源码中的电影列表
    for i,a,b in download_list:                                  # 对列表进行遍历,取出每一个电影名对应的详情页
        name=a+b                                                 # 此为电影名称   
        download_page='网站首页'+i                # 拼接出具体网址
        download_url_obj=urllib.request.urlopen(download_page)
        download_url_data=download_url_obj.read()
        download_url_text=download_url_data.decode()
        result = re.search(正则表达式2',download_url_text)          # 用正则表达式匹配出该页中的下载连接
        film_dict[name]=result.group(1)                                   # 以 字典名[电影名]=下载地址 来进行保存

def name_distinct(name):       # 对比数据库中已有的数据,防止重复插入
    sql='select id from movie_link where film_name=%s limit 1'            # 查询操作,查询是否有相同的数据
    cur.execute(sql,name)
    if cur.fetchone():
        return True
    else:
        return False

if __name__ == '__main__':
    conn=pymysql.connect(host='127.0.0.1',user='root',password='mysql',database='movie_db')
    cur=conn.cursor()
    film_dict={}                                             # 定义空字典保存电影名称和电影下载地址
    get_link()
    for name,link in film_dict.items():
         if name_distinct(name):
             print('已经有与之重复的资源')
             continue
         sql='insert into movie_link values (null,%s ,%s)'
         cur.execute(sql,[name,link])                        # 插入操作,将电影名和下载地址保存到数据库中

    conn.commit()                                            # 提交
    cur.close()
    conn.close()


你可能感兴趣的:(python,编程,爬虫)