14.python案例:爬取电影天堂中所有电视剧信息
1.python案例:爬取电影天堂中所有电视剧信息
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
'''=================================================
@Project -> File :pywork -> day10_test04
@IDE :PyCharm
@Author :xwl
@Date :2019/10/10 14:35
@Desc :
=================================================='''
import requests,pyperclip,time,sys,os,pymysql
from lxml import etree 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'}
URL = 'https://www.dytt8.net' # 电影天堂的主页(由于网站设置有问题,所以加了一个URL全局变量)
ALL_DATA=[] # 清除剪切板中的内容
def clean_up():
# 利用os模块中的popen方法调用电脑cmd.exe清除剪切板内容
# 用popen新建一个管道,然后用read()读取执行命令
result=os.popen('C:\Windows\System32\cmd.exe /c "echo off | clip"')
result.read() # 倒计时程序
def countdown(num_time):
for i in range(num_time,-1,-1):
mystr = '倒计时' + str(i) + '秒开始!'
print(mystr, end='')
time.sleep(1)
print('\b' * len(mystr), end='')
print('倒计时结束!') # 复制网址
def copy_url():
clean_up() # 调用clean_up函数清除剪切板中内容
print('请从浏览器复制电影天堂网址!')
time.sleep(10)
print('*' * 50)
url = pyperclip.paste() # 将剪切板中的内容保存到变量中
if url == '':
print('未从浏览器获取到网址,请重新复制!')
time.sleep(1)
print('*' * 50)
num = 20 # 倒计时时间设定
print('请在{}内复制完成,否则程序将结束!'.format(num))
time.sleep(1)
print('*' * 50)
countdown(num) # 调用countdown倒计时函数
url = pyperclip.paste() # 将剪切板中的内容保存到变量中
if url == '': # 如果仍旧未复制,则退出程序
sys.exit()
return url # 解析网页工具
def parse_tool(url):
try:
response = requests.get(url, headers=HEADERS)
text = response.content.decode('gbk', errors='ignore')
except Exception as a:
print('网站无响应')
html = etree.HTML(text)
return html # 获取需要爬取的网址
def get_url():
url=copy_url() # 为了调试程序方便,临时将此处复制网址程序禁用掉
# url='https://www.dytt8.net/index.htm' # 正式运行程序时,此处代码需要禁用掉,而应该用上面的代码调用函数
return url # 解析网页信息
def parse_url(): # 解析电视剧网页信息
def parse_tvUrl(title,url):
print(title,url) # 输出结果:华语电视剧 https://www.dytt8.net/html/tv/hytv/
print('-'*30)
# 提取华语电视剧网页共有几页的信息
html1=parse_tool(url)
option=html1.xpath('//div[@class="bd3r"]//div[@class="co_content8"]//select[@name="sldd"]/option[last()]/text()')[0]
for i in range(1,int(option)+1):
tv_list = [] # 将所有电视信息存入列表
# 遍历网页底部每页的网址
option_url='https://www.dytt8.net/html/tv/hytv/list_71_{}.html'.format(i)
html2=parse_tool(option_url)
href1s=html2.xpath('//div[@class="co_area2"]/div[@class="co_content8"]//table//td//a/@href')
# print('数量:',len(href1s)) # 调试用
print('第{}页'.format(i), '*' * 50)
for index,j in enumerate(href1s,1): # 用enumerate按顺序遍历,并带序号
tv_dict = {} # 将提取的电视名与下载地址保存在字典中
href1='https://www.dytt8.net'+j
html3=parse_tool(href1)
error=html3.xpath('//div[@align="center"]/div/text()')
if error!=[]:
print('网址有问题!')
continue
try:
tv_title=html3.xpath('//div[@class="co_area2"]/div[@class="title_all"]/h1/font[@color="#07519a"]/text()')[0]
# print(tv_title) # 调试用
tv_dict['tv_title']=tv_title
# 用contains进行模糊匹配
tv_download=html3.xpath('//div[@id="Zoom"]//table//td//a/@*')
# print(tv_download) # 调试用
tv_dict['tv_download']=tv_download
except Exception as a:
continue
tv_list.append(tv_dict)
# 添加数据爬取时的提示信息
str = '数据正在写入中'
for y in range(1,6):
print(str, end='')
str = '数据正在写入中'+'.'*y
time.sleep(0.1)
print('\b'*(len(str)),end='')
# print('计数',index) # 调试用
# print(tv_list) # 调试用
for index,info in enumerate(tv_list,1):
tv_title=info['tv_title']
tv_download=info['tv_download']
for k,j in enumerate(tv_download,1):
m = '第{}集'.format(k)
download=j
save_data(i,index,tv_title,m,download)
print('电视剧信息已写入数据库{}.'.format(i)) # 解析电影网页信息
def parse_movieUrl(title,url):
print(title,url) # 输出结果:2019新片精品 https://www.dytt8.net/html/gndy/dyzz/index.html
print('-' * 30)
print('爬取电影信息代码未完成,等待后续开发。') url=get_url()
html = parse_tool(url)
# response=requests.get(url,headers=HEADERS)
# text=response.content.decode('gbk',errors='ignore')
# html=etree.HTML(text)
# 因为源代码中按下面的路径查找divs1列表中有两个元素,而我们只是需要爬取第一个元素中
# 的内容,所以用list[0],然后在对该元素进行xpath查找
divs1=html.xpath('//div[@class="bd3r"]//div[@class="bd3rl"]')[0]
divs=divs1.xpath('./div[@class="co_area2"]')
tv_url={}
movie_url={}
for div in divs:
# -------------提取电视剧分类--------------#
# 将列表中的每一个元素提取出来,存入变量title
main_title = div.xpath('./div[@class="title_all"]/p/strong/text()')[0]
main_url=div.xpath('./div[@class="title_all"]/p/em/a/@href')[0]
# 由于电影天堂网站有个问题,即日韩电视剧后面跟的是完整的网址,而其
# 它的不是,所以需要进行一个判断操作
if main_title=='华语电视剧':
tv_url['main_title'] = main_title
tv_url['main_url']=URL + main_url
# -------------提取电影网址--------------#
elif main_title=='2019新片精品':
movie_url['movie_title']=main_title
movie_url['main_url'] = URL + main_url
else:
continue
# 调用电视剧解析函数解析网页信息
parse_tvUrl(tv_url['main_title'],tv_url['main_url'])
# 调用电影解析函数解析网页信息
parse_movieUrl(movie_url['movie_title'],movie_url['main_url']) # 数据写入数据库
def save_data(i,n,data1,m,data2):
table_name = 'xwl_{}'.format(i) # 变量类型的数据库表名
conn=pymysql.connect(host='localhost',user='root',
password='root',charset='utf8',port=3306)
cursor=conn.cursor()
try:
# 创建一个名为xwl_test的数据库
cursor.execute('create database if not exists xwl_test character set utf8;')
cursor.execute('use xwl_test;')
# 创建一个变量类型的数据库表名
sql1="create table if not exists `%s`(序号 int,电视剧名称 char(255),集数 char(20),下载地址 char(255)) character set utf8" %(table_name)
cursor.execute(sql1)
# 向变量类型的数据库表名中写入数据
sql2="insert into `%s`(序号,电视剧名称,集数,下载地址)" %(table_name) +" values(%s,%s,%s,%s)"
cursor.execute(sql2,(n,data1,m,data2))
conn.commit()
except Exception as e:
print('有部分数据写入出错') # 这样就可以在数据写入出错时自动跳过,从而使代码可以继续跑下去
finally:
conn.close() #--------------代码调用主模块---------------#
if __name__=='__main__':
parse_url()
出现以下情况,说明已经成功写入:
14.python案例:爬取电影天堂中所有电视剧信息的更多相关文章
- python利用requests和threading模块,实现多线程爬取电影天堂最新电影信息。
利用爬到的数据,基于Django搭建的一个最新电影信息网站: n1celll.xyz (用的花生壳动态域名解析,服务器在自己的电脑上,纯属自娱自乐哈.) 今天想利用所学知识来爬取电影天堂所有最新电影 ...
- Python爬取电影天堂指定电视剧或者电影
1.分析搜索请求 一位高人曾经说过,想爬取数据,要先分析网站 今天我们爬取电影天堂,有好看的美剧我在上面都能找到,算是很全了. 这个网站的广告出奇的多,用过都知道,点一下搜索就会弹出个窗口,伴随着滑稽 ...
- scrapy框架用CrawlSpider类爬取电影天堂.
本文使用CrawlSpider方法爬取电影天堂网站内国内电影分类下的所有电影的名称和下载地址 CrawlSpider其实就是Spider的一个子类. CrawlSpider功能更加强大(链接提取器,规 ...
- Python多线程爬虫爬取电影天堂资源
最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址,代码已经上传到GitHub上了,需要的同学可以自行下载.刚开始学习python希望可以获得宝贵的意见. ...
- Python爬虫 -- 抓取电影天堂8分以上电影
看了几天的python语法,还是应该写个东西练练手.刚好假期里面看电影,找不到很好的影片,于是有个想法,何不搞个爬虫把电影天堂里面8分以上的电影爬出来.做完花了两三个小时,撸了这么一个程序.反正蛮简单 ...
- requests+lxml+xpath爬取电影天堂
1.导入相应的包 import requests from lxml import etree 2.原始ur url="https://www.dytt8.net/html/gndy/dyz ...
- 简单python爬虫案例(爬取慕课网全部实战课程信息)
技术选型 下载器是Requests 解析使用的是正则表达式 效果图: 准备好各个包 # -*- coding: utf-8 -*- import requests #第三方下载器 import re ...
- requests+BeautifulSoup | 爬取电影天堂全站电影资源
import requests import urllib.request as ur from bs4 import BeautifulSoup import csv import threadin ...
- 爬虫 (6)- Scrapy 实战案例 - 爬取不锈钢的相关钢卷信息
超详细创建流程及思路 一. 新建项目 1.创建文件夹,然后在对应文件夹创建一个新的python项目 2.点击Terminal命令行窗口,运行下面的命令创建scrapy项目 scrapy startpr ...
随机推荐
- oracle函数 round(x[,y])
[功能]返回四舍五入后的值 [参数]x,y,数字型表达式,如果y不为整数则截取y整数部分,如果y>0则四舍五入为y位小数,如果y小于0则四舍五入到小数点向左第y位. [返回]数字 [示例] se ...
- jsp中文乱码六种情况---解决方案
转 jsp中文乱码六种情况---解决方案 2016年10月22日 21:32:55 阅读数:10672 来源:http://blog.csdn.net/lovesummerforever/articl ...
- jq杂项方法/工具方法----trim() html() val() text() attr()
https://www.cnblogs.com/sandraryan/ $.trim() 函数用于去除字符串两端的空白字符.在中间的时候不会去掉. var str = ' 去除字符串左右两端的空格,换 ...
- 31页PPT:基于Spark的移动大数据挖掘
31页PPT:基于Spark的移动大数据挖掘 数盟11.16 Data Science Meetup(DSM北京)分享:基于Spark的移动大数据挖掘分享嘉宾:张夏天(TalkingData首席数据科 ...
- LuaForWindows_v5.1.4-45和lua-5.1.4.tar.gz
Lua学习笔记(一) 安装调试环境 Lua学习笔记(一) 安装调试环境 觉得自己是该掌握一门脚本语言的时候了,虽然曾经用过C# 和JavaScript 写过Unity3D的脚本.但是,总觉得那 ...
- 日历价差(calendar spread)
日历价差(calendar spread) 是指投资者买进到期日较远的期权 (简称远期期权),同时又卖出相同行权价格.相同数量但到期日较近的期权(简称近期期权),赚取两个不同期权隐含波动率的差价或者其 ...
- 基于@AspectJ注解配置切面与基于XML配置切面
1. Waiter目标类 package com.smart.aop.advice.pointcut; public class Waiter { public void greetTo(String ...
- Nginx的三种应用场景介绍
配置虚拟主机 就是在一台服务器启动多个网站. 如何区分不同的网站: 1.域名不同 2.端口不同 1.1. 通过端口区分不同虚拟机 Nginx的配置文件: /usr/local/nginx/conf/n ...
- JVM调优-Jstack线程分析
jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使 ...
- Github上的英文解释
1.AFAIK: As far as I know. 据我所知 2.SPOF: Single point of failure. 单节点崩溃 3.ASAP: As soon as possible. ...