爬取电影天堂最新电影的名称和下载链接

此次的目标是爬取电影天堂最新200页的最新电影的电影名称和下载链接,电影的下载链接在二级页面,所以需要先匹配一级页面的所有链接,然后逐个请求二级页面,代码如下:

"""
    爬取电影天堂2019年的电影名称和链接
"""
import requests
import csv
from fake_useragent import UserAgent
from lxml import etree
import re
import time
import random

class DianyingtiantangSpider(object):
    def __init__(self):
        self.url = ‘https://www.dytt8.net/html/gndy/dyzz/list_23_{}.html‘
        # self.url2 = ‘https://www.dytt8.net/html/gndy/dyzz/20190918/59138.html‘

    def get_headers(self):
        """
            构造请求头
        :return:
        """
        ua = UserAgent()
        headers = {
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
            "Accept-Encoding": "gzip, deflate, br",
            "Accept-Language": "zh-CN,zh;q=0.9",
            "Cache-Control": "max-age=0",
            "Connection": "keep-alive",
            "Cookie": "UM_distinctid=16bdec86bc2679-07c211dd7aebc-15231708-1fa400-16bdec86bc3464; CNZZDATA1260535040=961678368-1562805532-https%253A%252F%252Fwww.baidu.com%252F%7C1562805532",
            "Host": "www.dytt8.net",
            "If-Modified-Since": "Thu, 19 Sep 2019 00:34:23 GMT",
            "If-None-Match": "80d1b3fb816ed51:326",
            "Sec-Fetch-Mode": "navigate",
            "Sec-Fetch-Site": "none",
            "Sec-Fetch-User": "?1",
            "Upgrade-Insecure-Requests": "1",
            "User-Agent": ua.random
        }
        return headers

    def re_func(self, re_bds, html):
        """
            正则表达式解析出第一页的排名链接
        :param re_bds:
        :param html:
        :return:
        """
        pattern = re.compile(re_bds, re.S)
        r_list = pattern.findall(html)

        return r_list

    def parse_index_page(self, url):
        """
            请求解析第一页的链接
        :param url:
        :return:
        """
        text = requests.get(url=url, headers=self.get_headers())
        text.encoding = ‘GBK‘
        # print(text.text)
        re_bds = r‘<table width="100%".*?<td width="5%".*?<a href="(.*?)".*?ulink">.*?</table>‘
        # link = re.findall(‘<table width="100%".*?<td width="5%".*?<a href="(.*?)".*?ulink">.*?</table>‘, text.text)
        # html = etree.HTML(text.text)
        # link = html.xpath("//ul/table[@class=‘tbspan‘][1]/tbody/tr[4]/td/text()")
        link = self.re_func(re_bds, text.text)
        print(link)
        # print(text)
        return link

    def parse_two_page(self, url):
        """
            请求解析第二页的电影名和下载链接
        :param url:
        :return:
        """
        text = requests.get(url=url, headers=self.get_headers())
        # print(text.text)
        text.encoding = ‘GBK‘

        html = etree.HTML(text.text)
        movie = html.xpath(‘//*[@id="header"]/div/div[3]/div[3]/div[1]/div[2]/div[1]/h1/font/text()‘)
        download = html.xpath(‘//tbody/tr/td/a/@href‘)
        # movie=re.findall("",text.text)
        print(movie)
        print(download)
        # print(html)
        return (movie[0], download[0])

    def save_csv(self, result):
        """
            保存到csv文件
        :param result:
        :return:
        """
        with open(‘movie.csv‘, ‘a‘, newline=‘‘)as f:
            writer = csv.writer(f)
            writer.writerows(result)

    def run(self):
        """
            主函数
        :return:
        """
        for i in range(1, 201):
            url1 = self.url.format(i)
            list_result = []
            link = self.parse_index_page(url1)
            for j in link:
                url2 = ‘https://www.dytt8.net‘ + j
                try:
                    result = self.parse_two_page(url2)
                    print(result)
                    list_result.append(result)
                    time.sleep(random.uniform(1, 3))
                except Exception as err:
                    print(err)
            self.save_csv(list_result)
            print("第%s页保存成功" % i)

if __name__ == ‘__main__‘:
    spider = DianyingtiantangSpider()
    spider.run()

一级页面:

二级页面:

总结:

1.在爬取电影天堂的时候发现,请求一级页面的时候得到的网页源码中居然缺少了一些标签,所以刚开始总是匹配不到东西,xpath有时候并非万能,特别是遇到这种页面缺失的.这时候就不得不拿出杀手锏正则表达式了,只要页面出现的东西,正则就能拿到,当然正则有时候会匹配出一下重复值,这时候只要用到python中的集合函数set()处理一下就行.

2.还遇到了另一个问题,就是电影天堂的编码是gb2312,所以刚开始请求得到的网页中的中文是乱码,一番查询之后发现只要添加一下代码就能成功解决

text = requests.get(url=url, headers=self.get_headers())
text.encoding = ‘GBK‘

原文地址:https://www.cnblogs.com/lattesea/p/11746482.html

时间: 2024-08-03 11:02:10

爬取电影天堂最新电影的名称和下载链接的相关文章

爬取电影天堂最新电影的名称和下载链接(增量爬取mysql存储版)

这次的程序是在上次的基础上进行修改,把持久化储存方式改成mysql,并增加了断点续爬功能. import requests import re from fake_useragent import UserAgent import random import time import pymysql from hashlib import md5 from lxml import etree class DianyingtiantangSpider(object): def __init__(se

【PY】没有电影看?来教你用Python爬取电影天堂最新电影!

项目开始 第一步仍然是创建scrapy项目与spider文件 切换到工作目录两条命令依次输入 scrapy startproject xunleidianying scrapy genspider xunleiBT https://www.xl720.com/thunder/years/2019 内容分析 打开目标网站(分类是2019年上映的电影),分析我们需要的数据 进入页面是列表的形式就像豆瓣电影一样,然后我们点进去具体页面看看 这个页面就是我们需要拿到的内容页面,我们来看我们需要哪些数据(

python爬虫抓取电影天堂最新电影

该小脚本实现对电影天堂网站的最新电影查找. from bs4 import BeautifulSoup  import  urllib import  re url= 'http://www.ygdy8.net/html/gndy/dyzz/index.html' moive_url_list = [] moive_name_list = [] request = urllib.urlopen(url) response = request.read() response = unicode(r

BeautifulSoup爬取电影天堂全站电影资源

#爬取电影天堂全站电影资源链接#功能:#1.获取电影天堂资源下载链接并输出#2.所有链接保存为一个csv文件 import timeimport requestsfrom bs4 import BeautifulSoupimport csv def spider(url): global page, No, fobj try: page += 1 print("第{}页".format(page)) # time.sleep(1) #获取网页链接并读取 html = requests.

爬取搜索出来的电影的下载地址并保存到excel

一.背景 利用Requests模块获取页面,BeautifulSoup来获取需要的内容,最后利用xlsxwriter模块讲内容保存至excel,首先通过讲关键字收拾出来的页面获取到子页面的url,然后再次去抓取获取到子页面的信息保存到excel 二.代码 编写了两个模块,geturldytt和getexceldytt,最后在main内调用 geturldyttd代码如下: #!/bin/env python # -*- coding:utf-8 -*- from urllib import pa

简单爬取《小丑》电影豆瓣短评生成词云

导语  在前段时间看了杰昆菲尼克斯的小丑电影,心里很好奇大部分观众看完这部电影之后对此有什么评价,然后看了看豆瓣短评之后,觉得通过python把短评中出现最多的单词提取出来,做成一张词云,看看这部电影给观众们留下的关键词是什么. 抓取数据  首先刚开始的时候 ,是通过requests去模拟抓取数据,发现短评翻页翻到20页之后就需要登录豆瓣用户才有权限查看,所以打算通过使用selenium模拟浏览器动作自动化将页面中的数据爬取下来,然后存储到特定的txt文件,由于没打算做其他的分析,就不打算存放到

爬取豆瓣的tp250电影名单

# https://movie.douban.com/top250?start=25&filter= 要爬取的网页 import re from urllib.request import urlopen def getPage(url): response=urlopen(url) return response.read().decode('utf-8') def parsePage(s): ret=com.finditer(s) for i in ret: ret={ 'id': i.gr

用Python爬取豆瓣Top250的电影标题

所以我们可以这么写去得到所有页面的链接我们知道标题是在 target="_blank"> 标题的位置</a> 之中 所以可以通过正则表达式找到所有符合条件的标题 将内容写入到表格保存起来 下面贴入完整代码 import requests, bs4, re, openpyxl url = 'https://www.douban.com/doulist/3936288/?start=%s' urls = [] 多少页 pages = 10 for i in range(p

python3 爬取qq音乐作者所有单曲 并且下载歌曲

1 import requests 2 import re 3 import json 4 import os 5 6 7 8 # 便于存放作者的姓名 9 zuozhe = [] 10 11 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'} 12 13 14 def ge