爬取电影天堂最新电影的名称和下载链接(增量爬取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__(self):
        self.url = ‘https://www.dytt8.net/html/gndy/dyzz/list_23_{}.html‘
        self.db = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, password=‘数据库密码‘, database=‘filmskydb‘,
                                  charset=‘utf8‘)
        self.cursor = self.db.cursor()

    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 parse_page(self, url):
        """
            解析一级页面
        :param url:
        :return:
        """
        text = requests.get(url=url, headers=self.get_headers())
        text.encoding = ‘GBK‘
        # 正则匹配第一页的二级页面链接
        re_bds = r‘<table width="100%".*?<td width="5%".*?<a href="(.*?)".*?ulink">.*?</table>‘
        pattern = re.compile(re_bds, re.S)
        link_list = pattern.findall(text.text)
        for link in link_list:
            two_url = ‘https://www.dytt8.net‘ + link
            # 生成指纹
            s = md5()
            s.update(two_url.encode())
            two_url_md5 = s.hexdigest()
            # 引入函数判断链接在数据库中是不是存在
            if self.judge_repetition(two_url_md5):
                self.parse_two_page(two_url)
                # 将指纹保存在数据库中
                ins = ‘insert into request_finger values(%s)‘
                self.cursor.execute(ins, [two_url_md5])
                # 切记要提交至数据库执行
                self.db.commit()
                # 随机产生爬取时间间隔
                time.sleep(random.uniform(1, 3))

    def judge_repetition(self, two_url_md5):
        """
            指纹判断
        :param two_url_md5:
        :return:
        """
        sel = ‘select finger from request_finger where finger=%s‘
        result = self.cursor.execute(sel, [two_url_md5])
        if not result:
            return True

    def parse_two_page(self, two_url):
        """
            提取二级页面的信息
        :param two_url:
        :return:
        """
        text = requests.get(url=two_url, headers=self.get_headers())
        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‘)
        # print(movie)
        # print(download)
        # return (movie[0], download[0])
        ins = ‘insert into filmtab values(%s,%s)‘
        film_list = movie + download
        self.cursor.execute(ins, film_list)
        self.db.commit()
        print(film_list)

    def run(self):
        """
            主函数
        :return:
        """
        for page in range(1, 201):
            one_url = self.url.format(page)
            self.parse_page(one_url)
            time.sleep(random.uniform(1, 3))

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

数据库的话需要提前建好,代码如下:

create database filmskydb charset utf8;
use filmskydb;
create table request_finger(
finger char(32)
)charset=utf8;
create table filmtab(
name varchar(200),
download varchar(500)
)charset=utf8;

总结:1.增量爬取的原理其实很简单,就是将爬取过的url储存入库,然后在下次爬取的是后将url与库中的url进行比较,去掉已经爬过的url,从而实现断点续爬.这一点很重要,特别是如果在爬取大量数据的时候电脑突然扑街了,然后要从头开始爬取的话,那对工作效率的影响是很大的.

2.这里的指纹其实就是将爬过url用md5加密之后生成的唯一字符串,用于与后来的url进行比较

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

时间: 2024-07-30 08:40:49

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

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

此次的目标是爬取电影天堂最新200页的最新电影的电影名称和下载链接,电影的下载链接在二级页面,所以需要先匹配一级页面的所有链接,然后逐个请求二级页面,代码如下: """ 爬取电影天堂2019年的电影名称和链接 """ import requests import csv from fake_useragent import UserAgent from lxml import etree import re import time import

【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.

爬取某电影网站最新电影

1 # -*- coding: utf-8 -*- 2 """ 3 Created on Wed Oct 12 16:48:33 2016 4 5 @author: fuzzier 6 """ 7 8 import requests 9 from bs4 import BeautifulSoup 10 import re 11 import os 12 import codecs 13 14 URL = 'http://www.xxxxx.net

php采集电影天堂首页电影下载地址

<?php // 目标url http://www.dytt8.net/ set_time_limit(0); define('SCRIPT_ROOT',dirname(__FILE__).'/'); $result_list = array(); $domain = "http://www.dytt8.net"; $html = file_get_contents($domain); $matchs = array(); preg_match_all("/\<a

实例练习----电影天堂抓取下载链接

废话不多说,直接上代码: package com.sysker.util; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.Date; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jso

requests+lxml+xpath爬取电影天堂

1.导入相应的包 import requests from lxml import etree 2.原始ur url="https://www.dytt8.net/html/gndy/dyzz/list_23_1.html" 我们要爬取的是最新电影,在该界面中,我们发现,具体的信息存储在每个名字的链接中,因此我们要获取所有电影的链接才能得到电影的信息.同时我们观察url,发现 list_23_1,最后的1是页面位于第几页.右键点击其中一个电影的名字-检查. 我们发现,其部分连接位于具有

Python多线程爬虫爬取电影天堂资源

最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址,代码已经上传到GitHub上了,需要的同学可以自行下载.刚开始学习python希望可以获得宝贵的意见. 先来简单介绍一下,网络爬虫的基本实现原理吧.一个爬虫首先要给它一个起点,所以需要精心选取一些URL作为起点,然后我们的爬虫从这些起点出发,抓取并解析所抓取到的页面,将所需要的信息提取出来,同时获得的新的URL插入到队列中作为下一次爬取的起点.这样不断地循环,一直到获得你想得到的所有的信息爬虫的任务