末世苍雪

root@jtahstu.com   Github  

最新碎语:这个M1 MBP, PHP多版本环境装的我极度崩溃, 历时4个小时终于搞定了. 1. brew转不了7.x的环境, 默认只能装8.1, 恶心. 2. Nginx装上了, 但是请求转发不到php-fpm上, 试了各种配置都不行, 删掉Nginx转战Apache, 吐了. 3. 系统自带httpd, brew能装上httpd但搞死启动不了httpd, 只能手动启动和关闭httpd, 无语. 4. 以上问题都解决后, 加上自己写的启动和关闭脚本, 目前能正常跑起来PHP文件了, 开心! 为啥目前没有开源好用的M1 MNMP环境哇, o(≧口≦)o

您的位置:末世苍雪 >笔记> Python爬虫 之 抓取豆瓣电影Top250剧照

Python爬虫 之 抓取豆瓣电影Top250剧照

目标

前面抓完了列表页和详情页,大体相似,只是不同页面的解析规则不太一样,实际就是那几个步骤

今天我们就来抓点图片,然后down下来,是不是很兴奋?

兴奋个屁啊,需要经常维护,几天都跑不完

步骤

1. 读取数据库获取电影详情页链接,并拼出所有剧照页的链接

2. 解析某部电影的剧照链接

3. 下载图片

第三方库

基本和前面的一样

创建文件夹用到os模块

下载图片用到urllib.request模块

基本模板

//剧照列表页
<li data-id="490571815">
	<div class="cover">
		<a href="https://movie.douban.com/photos/photo/490571815/">
			<img src="https://img3.doubanio.com/view/photo/thumb/public/p490571815.jpg">
		</a>
	</div>

	<div class="prop">
		400x556
	</div>
	<div class="name">

		<a href="https://movie.douban.com/photos/photo/490571815/#comments">
			78回应
		</a>
	</div>
</li>

//某一张图片页
<a class="mainphoto" href="https://movie.douban.com/photos/photo/456482220/#title-anchor" title="点击查看下一张">
    <img src="https://img3.doubanio.com/view/photo/photo/public/p490571815.jpg">
</a>

Code


"""
@author: jtusta
@license: MIT Licence 
@contact: root@jtahstu.com
@site: www.jtahstu.com
@software: PyCharm Community Edition
@file: getMoviesPics.py
@time: 2017/01/11 20:53
"""
import requests
from bs4 import BeautifulSoup
import pymysql
import pymysql.cursors
import urllib.request
import os
import time

headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
    , 'user-agent': 'Mozilla/4.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/40.0'
    , 'Host': 'movie.douban.com'
    , 'Referer': 'https://movie.douban.com/subject/1292720/'
    , 'Upgrade-Insecure-Requests': '1'
    , 'Cache-Control': 'max-age=0'
    , 'Connection': 'keep-alive'
    , 'Accept-Encoding': 'gzip, deflate, br'
    , 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3'
    ,
           'Cookie': r'll="118196"; bid=evZLAlOEOig; __utma=30149280.19825895.1474635803.1484139127.1484160425.56; __utmz=30149280.1483778648.43.12.utmcsr=baidu|utmccn=(organic)
|utmcmd=organic; __utma=223695111.1921859920.1474635809.1484139127.1484160425.45; __utmz=223695111.1475944004.8.6.utmcsr=douban.com|utmccn=(referral)|utmcmd=referral
|utmcct=/; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1484160423%2C%22https%3A%2F%2Fwww.douban.com%2F%22%5D; _pk_id.100001.4cf6=9c61c443617ff098.1474635810.45.1484160913.1484143311.;
 _vwo_uuid_v2=F7FF27DA6C98B9BD15D6F260CC25B989|f1654bdbf661fc84cb743dc31aebfd6e; gr_user_id=9a6c5ff8-a80a-4b91-a715-75f80c10d044; viewed="1054685_26697350"; dbcl2="119273185:REEk8LlBtVY";
 push_noty_num=0; push_doumail_num=0; __utmv=30149280.11927; ap=1; ck=puNv; _pk_ses.100001.4cf6=*; __utmb=30149280.0.10.1484160425; __utmc=30149280; __utmb=223695111.0.10.1484160425; __utmc=223695111; ct=y'}


def db(type, rank, detail=[]):
    res = ""
    connection = pymysql.connect (host='localhost',
                                  user='root',
                                  password='pass',
                                  db='test',
                                  port=3306,
                                  charset='utf8')
    cursor = connection.cursor ()
    if type == 1:
        sql = 'select detail_url,title from douban_movie_top250 where rank=%s'
        cursor.execute (sql, (str (rank)));
        res = cursor.fetchone ()
    elif type == 2:
        sql = 'insert into douban_movie_top250_details(rank,dirsctor, screenwriter, starring, type, location, language, rel_time, len, other_names, imdb, introduce)' \
              'values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
        count = cursor.execute (sql, (
            rank, detail[0], detail[1], detail[2], detail[3], detail[4], detail[5], detail[6], detail[7], detail[8],
            detail[9], detail[10]))
        if count:
            res = 'insert rank ' + str (rank) + ' ok'
        else:
            res = 'insert rank ' + str (rank) + ' fail'
    connection.commit ()
    cursor.close ()
    connection.close ()
    return res


def getUrl(rank):
    res = db (1, rank)
    return res[0]


def getTitle(rank):
    res = db (1, rank)
    return res[1]


def downPics(url, path, rank, count):
    html = requests.get (url, headers=headers)
    soup = BeautifulSoup (html.text, "html.parser")
    span = soup.select (".mainphoto")
    if len (span) > 0:
        picRealUrl = span[0].img["src"]
        conn = urllib.request.urlopen (picRealUrl)
        f = open (path, 'wb')
        f.write (conn.read ())
        f.close ()
        print ("下载 rank " + str (rank) + " 的第 " + str (count) + " 张图片 ok !")


def getPics(url, rank, page):
    html = requests.get (url, headers=headers)
    soup = BeautifulSoup (html.text, "html.parser")
    cover = soup.select (".cover")
    count = 0
    picPath = 'C:\\Users\\jtahstu\\Desktop\\' + str (rank) + " " + getTitle (rank)
    if not os.path.isdir (picPath):
        os.mkdir (picPath)
    for i in cover:
        picUrl = i.a["href"]
        count += 1
        countt = count + (page - 1) * 40
        name = str (countt) + ".jpg"
        picPathSave = picPath + "\\" + name
        downPics (picUrl, picPathSave, rank, countt)
        time.sleep (1)


rank = 250
pages = 10
for rank in range (45, rank + 1):
    print ("正在抓取rank %d" % rank)
    for page in range (1, pages + 1):
        try:
            url = getUrl (rank) + "photos?type=S&start=" + str ((page - 1) * 40) + "&sortby=vote&size=a&subtype=a"
            getPics (url, rank, page)
        except Exception as e:
            print("错误信息:{0}".format(e))
            print ("抓取 rank %d 的第 %d 页图片失败 !" % (rank, page))
            continue

  因为要抓取的图片太多,一部电影抓取前10页,1页40张,1部电影400张,250部10 0000张,灰常夸张的数量,所以程序在跑到一定程度上就会卡住不动,而且这个程序的耗时也是灰常夸张


今天从上班早上10点左右开始跑,跑到现在下午5点半,7.5个小时也才抓了30部电影左右,中间还有好多页面没解析出来跳过了,所以跑完是需要相当长时间的

然后需要经常维护

执行过程

...省略...
正在抓取rank 46
下载 rank 46 的第 1 张图片 ok !
下载 rank 46 的第 2 张图片 ok !
下载 rank 46 的第 3 张图片 ok !
下载 rank 46 的第 4 张图片 ok !
下载 rank 46 的第 5 张图片 ok !
下载 rank 46 的第 6 张图片 ok !
下载 rank 46 的第 7 张图片 ok !
下载 rank 46 的第 8 张图片 ok !
下载 rank 46 的第 9 张图片 ok !
下载 rank 46 的第 10 张图片 ok !
下载 rank 46 的第 11 张图片 ok !
下载 rank 46 的第 12 张图片 ok !
下载 rank 46 的第 13 张图片 ok !
下载 rank 46 的第 14 张图片 ok !
下载 rank 46 的第 15 张图片 ok !
下载 rank 46 的第 16 张图片 ok !
下载 rank 46 的第 17 张图片 ok !
下载 rank 46 的第 18 张图片 ok !
下载 rank 46 的第 19 张图片 ok !
下载 rank 46 的第 20 张图片 ok !
...省略...

  截图



总结

爬图片是非常有意思的事情,一定要学会哦!

---

本文章采用 知识共享署名2.5中国大陆许可协议 进行许可,转载必须注明作者和本文链接。

---

二维码加载中...

扫一扫移动端访问O(∩_∩)O

发表评论

54 + 31 =
路人甲 表情
看不清楚?点图切换 Ctrl+Enter快速提交
正在加载中……