• 14.python案例:爬取电影天堂中所有电视剧信息


    1.python案例:爬取电影天堂中所有电视剧信息

      1 #!/usr/bin/env python3
      2 # -*- coding: UTF-8 -*-
      3 '''=================================================
      4 @Project -> File   :pywork -> day10_test04
      5 @IDE    :PyCharm
      6 @Author :xwl
      7 @Date   :2019/10/10 14:35
      8 @Desc   :
      9 =================================================='''
     10 import requests,pyperclip,time,sys,os,pymysql
     11 from lxml import etree
     12 
     13 HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'}
     14 URL = 'https://www.dytt8.net'  # 电影天堂的主页(由于网站设置有问题,所以加了一个URL全局变量)
     15 ALL_DATA=[]
     16 
     17 # 清除剪切板中的内容
     18 def clean_up():
     19     # 利用os模块中的popen方法调用电脑cmd.exe清除剪切板内容
     20     # 用popen新建一个管道,然后用read()读取执行命令
     21     result=os.popen('C:WindowsSystem32cmd.exe /c "echo off | clip"')
     22     result.read()
     23 
     24 # 倒计时程序
     25 def countdown(num_time):
     26     for i in range(num_time,-1,-1):
     27         mystr = '倒计时' + str(i) + '秒开始!'
     28         print(mystr, end='')
     29         time.sleep(1)
     30         print('' * len(mystr), end='')
     31     print('倒计时结束!')
     32 
     33 # 复制网址
     34 def copy_url():
     35     clean_up()  # 调用clean_up函数清除剪切板中内容
     36     print('请从浏览器复制电影天堂网址!')
     37     time.sleep(10)
     38     print('*' * 50)
     39     url = pyperclip.paste()  # 将剪切板中的内容保存到变量中
     40     if url == '':
     41         print('未从浏览器获取到网址,请重新复制!')
     42         time.sleep(1)
     43         print('*' * 50)
     44         num = 20  # 倒计时时间设定
     45         print('请在{}内复制完成,否则程序将结束!'.format(num))
     46         time.sleep(1)
     47         print('*' * 50)
     48         countdown(num)  # 调用countdown倒计时函数
     49         url = pyperclip.paste()  # 将剪切板中的内容保存到变量中
     50         if url == '':  # 如果仍旧未复制,则退出程序
     51             sys.exit()
     52     return url
     53 
     54 # 解析网页工具
     55 def parse_tool(url):
     56     try:
     57         response = requests.get(url, headers=HEADERS)
     58         text = response.content.decode('gbk', errors='ignore')
     59     except Exception as a:
     60         print('网站无响应')
     61     html = etree.HTML(text)
     62     return html
     63 
     64 # 获取需要爬取的网址
     65 def get_url():
     66     url=copy_url()    # 为了调试程序方便,临时将此处复制网址程序禁用掉
     67     # url='https://www.dytt8.net/index.htm'   # 正式运行程序时,此处代码需要禁用掉,而应该用上面的代码调用函数
     68     return url
     69 
     70 # 解析网页信息
     71 def parse_url():
     72 
     73     # 解析电视剧网页信息
     74     def parse_tvUrl(title,url):
     75         print(title,url)    # 输出结果:华语电视剧 https://www.dytt8.net/html/tv/hytv/
     76         print('-'*30)
     77         # 提取华语电视剧网页共有几页的信息
     78         html1=parse_tool(url)
     79         option=html1.xpath('//div[@class="bd3r"]//div[@class="co_content8"]//select[@name="sldd"]/option[last()]/text()')[0]
     80         for i in range(1,int(option)+1):
     81             tv_list = []  # 将所有电视信息存入列表
     82             # 遍历网页底部每页的网址
     83             option_url='https://www.dytt8.net/html/tv/hytv/list_71_{}.html'.format(i)
     84             html2=parse_tool(option_url)
     85             href1s=html2.xpath('//div[@class="co_area2"]/div[@class="co_content8"]//table//td//a/@href')
     86             # print('数量:',len(href1s))  # 调试用
     87             print('第{}页'.format(i), '*' * 50)
     88             for index,j in enumerate(href1s,1): # 用enumerate按顺序遍历,并带序号
     89                 tv_dict = {}  # 将提取的电视名与下载地址保存在字典中
     90                 href1='https://www.dytt8.net'+j
     91                 html3=parse_tool(href1)
     92                 error=html3.xpath('//div[@align="center"]/div/text()')
     93                 if error!=[]:
     94                     print('网址有问题!')
     95                     continue
     96                 try:
     97                     tv_title=html3.xpath('//div[@class="co_area2"]/div[@class="title_all"]/h1/font[@color="#07519a"]/text()')[0]
     98                     # print(tv_title)  # 调试用
     99                     tv_dict['tv_title']=tv_title
    100                     # 用contains进行模糊匹配
    101                     tv_download=html3.xpath('//div[@id="Zoom"]//table//td//a/@*')
    102                     # print(tv_download)  # 调试用
    103                     tv_dict['tv_download']=tv_download
    104                 except Exception as a:
    105                     continue
    106                 tv_list.append(tv_dict)
    107                 # 添加数据爬取时的提示信息
    108                 str = '数据正在写入中'
    109                 for y in range(1,6):
    110                     print(str, end='')
    111                     str = '数据正在写入中'+'.'*y
    112                     time.sleep(0.1)
    113                     print(''*(len(str)),end='')
    114                 # print('计数',index) # 调试用
    115                 # print(tv_list) # 调试用
    116             for index,info in enumerate(tv_list,1):
    117                 tv_title=info['tv_title']
    118                 tv_download=info['tv_download']
    119                 for k,j in enumerate(tv_download,1):
    120                     m = '第{}集'.format(k)
    121                     download=j
    122                     save_data(i,index,tv_title,m,download)
    123             print('电视剧信息已写入数据库{}.'.format(i))
    124 
    125     # 解析电影网页信息
    126     def parse_movieUrl(title,url):
    127         print(title,url)    # 输出结果:2019新片精品 https://www.dytt8.net/html/gndy/dyzz/index.html
    128         print('-' * 30)
    129         print('爬取电影信息代码未完成,等待后续开发。')
    130 
    131     url=get_url()
    132     html = parse_tool(url)
    133     # response=requests.get(url,headers=HEADERS)
    134     # text=response.content.decode('gbk',errors='ignore')
    135     # html=etree.HTML(text)
    136     # 因为源代码中按下面的路径查找divs1列表中有两个元素,而我们只是需要爬取第一个元素中
    137     # 的内容,所以用list[0],然后在对该元素进行xpath查找
    138     divs1=html.xpath('//div[@class="bd3r"]//div[@class="bd3rl"]')[0]
    139     divs=divs1.xpath('./div[@class="co_area2"]')
    140     tv_url={}
    141     movie_url={}
    142     for div in divs:
    143         # -------------提取电视剧分类--------------#
    144         # 将列表中的每一个元素提取出来,存入变量title
    145         main_title = div.xpath('./div[@class="title_all"]/p/strong/text()')[0]
    146         main_url=div.xpath('./div[@class="title_all"]/p/em/a/@href')[0]
    147         # 由于电影天堂网站有个问题,即日韩电视剧后面跟的是完整的网址,而其
    148         # 它的不是,所以需要进行一个判断操作
    149         if main_title=='华语电视剧':
    150             tv_url['main_title'] = main_title
    151             tv_url['main_url']=URL + main_url
    152         # -------------提取电影网址--------------#
    153         elif main_title=='2019新片精品':
    154             movie_url['movie_title']=main_title
    155             movie_url['main_url'] = URL + main_url
    156         else:
    157             continue
    158     # 调用电视剧解析函数解析网页信息
    159     parse_tvUrl(tv_url['main_title'],tv_url['main_url'])
    160     # 调用电影解析函数解析网页信息
    161     parse_movieUrl(movie_url['movie_title'],movie_url['main_url'])
    162 
    163 # 数据写入数据库
    164 def save_data(i,n,data1,m,data2):
    165     table_name = 'xwl_{}'.format(i) # 变量类型的数据库表名
    166     conn=pymysql.connect(host='localhost',user='root',
    167                          password='root',charset='utf8',port=3306)
    168     cursor=conn.cursor()
    169     try:
    170         # 创建一个名为xwl_test的数据库
    171         cursor.execute('create database if not exists xwl_test character set utf8;')
    172         cursor.execute('use xwl_test;')
    173         # 创建一个变量类型的数据库表名
    174         sql1="create table if not exists `%s`(序号 int,电视剧名称 char(255),集数 char(20),下载地址 char(255)) character set utf8" %(table_name)
    175         cursor.execute(sql1)
    176         # 向变量类型的数据库表名中写入数据
    177         sql2="insert into `%s`(序号,电视剧名称,集数,下载地址)" %(table_name) +" values(%s,%s,%s,%s)"
    178         cursor.execute(sql2,(n,data1,m,data2))
    179         conn.commit()
    180     except Exception as e:
    181         print('有部分数据写入出错')  # 这样就可以在数据写入出错时自动跳过,从而使代码可以继续跑下去
    182     finally:
    183         conn.close()
    184 
    185 #--------------代码调用主模块---------------#
    186 if __name__=='__main__':
    187     parse_url()

     出现以下情况,说明已经成功写入:

  • 相关阅读:
    Luogu P1131 时态同步
    Codeforces Round #507 B. Shashlik Cooking
    Codeforces Round #507 A. Palindrome Dance
    Luogu P3818 小A和uim之dark♂逃离 Ⅱ
    Luogu P1373 小a和uim之dark♂逃离 Ⅰ
    Luogu P4822 [BJWC2012]冻结
    Luogu P2575 高手过招(博弈论)
    Luogu P1074靶形数独
    Luogu P2323「皇后游戏」
    GodFly的寻宝之旅·状压DP
  • 原文地址:https://www.cnblogs.com/ubuntu1987/p/11678757.html
Copyright © 2020-2023  润新知