豆瓣top250海报原图爬取
admin
2023-07-30 21:44:39
0

功能分析

网上爬取豆瓣电影排行很多,但是由于做一个h5画廊需求大量电影素材,而列表与详情页的图片清晰度满足不了要求,所以决定爬取豆瓣原图,在查看是发现需要登陆,然而登陆后原图链接查看并没有任何cookie信息在请求头,遂想直接构造链接爬取,爬取过程出现302,重新分析请求头,发现有referer,嗯,直接加了豆瓣首页作为referer,mdfuck居然没有用,后来发现每个原图需要带着该图前中等缩略图链接作为referer,可以看出豆瓣在服务器端作了比较严格的过滤处理,虽然在nginx上也做过图片防盗链,自认为没有做如此猥琐,别人猥琐,咱也不能谦虚是吧,一个个构造请求头,利用python爬取原图。

所需模块

网页内容抓取用urllib2

页面解析用pyquery(一个可以用jquey方式解析html的模块)

下面是代码部分:(好久没写python,表示有点手生ฅʕ•̫͡•ʔฅ,图片大概200m,页面爬取很快,最后是io下载,所以速度还是取决网速)

#coding:utf-8

import urllib2
import re
import sys
import time
from pyquery import PyQuery as pq
#http://movie.douban.com/top250?start=0&filter=&type= 
class Douban:
    def __init__(self):
        reload(sys)
        sys.setdefaultencoding(\'utf-8\')
        self.start = 0
        self.param = \'&filter=&type=\'
        self.headers = {\'User-Agent\':\'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.113 Safari/537.36\'}
        self.movieList = []
        self.filePath = \'./img/\'
        self.imgpath = \'https://img3.doubanio.com/view/photo/raw/public/\'
        self.refer = \'https://movie.douban.com/photos/photo/\'

    def getPage(self):
        print \'---getpagestart---\'
        try:
            URL = \'http://movie.douban.com/top250?start=\' + str(self.start)
            request = urllib2.Request(url = URL, headers=self.headers)
            response = urllib2.urlopen(request)
            page = response.read().decode(\'utf-8\')
            pageNum = (self.start + 25)/25
            print \'scrabing \' + str(pageNum) + \'page...\'
            self.start += 25;
            return page
        except urllib2.URLError, e:
            if hasattr(e, \'reason\'):
                print \'failed reason\', e.reason
    def htmlparse(self):
        print \'---getMoviestart---\'
        while self.start  < 250:

            page = self.getPage()
            html = pq(page);
            list = html(\".grid_view>li\")
            info = {};
            for item in list:
                item = pq(item)
                info[\'name\'] = item(\".hd>a\").text()
                info[\'des\'] = item(\".bd p:first\").text()
                info[\'img\'] = item(\".pic img\").attr(\'src\');

                group = re.findall(r\'\\\\/(p(\\\\d+)\\\\.jpg)\', info[\'img\'])

                info[\'img\'] = self.imgpath + group[0][0]
                info[\'refer\'] = self.refer + group[0][1] + \'/\'
                #print info

                self.movieList.append([info[\'name\'], info[\'des\'], info[\'img\'],info[\'refer\']])


    def hook(self):
        mfile = open(self.filePath + \'movielist.txt\', \'w\')
        try:
            for index, movie in enumerate(self.movieList):
                print movie[0].encode(\'gbk\',\'ignore\')
                #print movie
                self.downImg(movie[2], movie[3], self.filePath + \'movie\' + str(index+1) + \'.jpg\')
                mfile.write(str(index+1) + \'、\' + movie[0] + \'\\\\n\'+ movie[1] + \'\\\\n\')
            print \'wirte done\'
        finally:
            mfile.close()

    def downImg(self, URL, refer, imgpath):
        head = {\'User-Agent\':\'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.113 Safari/537.36\'};
        head[\'Referer\'] = refer
        request = urllib2.Request(url = URL, headers = head)
        try:
            f = open(imgpath, \'wb\')
            res = urllib2.urlopen(request).read()
            f.write(res)
            f.close()
        except urllib2.URLError, e:
            if hasattr(e, \'reason\'):
                print \'failed reason\', e.reason
    def main(self):
        print \'---mainstart---\'
        self.htmlparse()
        print len(self.movieList) 
        self.hook()
DB = Douban()
DB.main()

运行效果


图片发自简书App


图片发自简书App


图片发自简书App


图片发自简书App

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...