【Python3】【老司机系列】日本dmm网站抓取(一)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/WelcomeToHebei/article/details/51812760

长夜漫漫,无心睡眠,您还在漫无目的地找片嘛,您还在手忙较短地查封面嘛,您还在为某些小网站上铺天盖地的小广告发愁嘛……岛国DMM网站,干净清爽,是您按图(番号)神秘代码查找“样片”的好地方

……

PS:最近想找点私活,本人Python略懂日语精通,如有需要批量爬取(不太复杂的)数据的需求请联系(QQ:569518379)~


正文


岛国网站 http://www.dmm.co.jp/上有比较多的(正常)资源,也有许多(不正常的)资源。(不正常的)资源链接形如:http://www.dmm.co.jp/mono/dvd/。如下图所示,不过如果想要欣赏网站的资源,需要付费购买,具体可以选择包月或者按影片购买(具体怎么办我也不知道,因为没有买过嘛~)。

当然啦,这样的网站不符合Core Socialist Values,一定会被墙的啦!不过我爬取这个网站的时候正好在岛国,所以不涉及这方面的问题。

1. 网站结构分析

dmm提供了多重查找的方式,可以按“演员名”,“系列名”等多重方法查找。在这里我们通过“公司名”查找。

这是メーカー的链接:http://www.dmm.co.jp/mono/dvd/-/maker/


可以看到,它是通过假名分类的。点击あ行,还可以看到每行的的每个假名都有各自的页面。


同时,对于每个假名下的公司名,也被分成了两类。上面有图标的是比较大的公司,下面还有一些小公司。两者是不会重复的。


あ开头的链接:http://www.dmm.co.jp/mono/dvd/-/maker/=/keyword=a/

い开头的链接:http://www.dmm.co.jp/mono/dvd/-/maker/=/keyword=i/

を开头的链接:http://www.dmm.co.jp/mono/dvd/-/maker/=/keyword=wo/

注意到を开头的链接是没有热门公司的。同时,手动点击就能发现,ん并没有结果。

PS:这个程序是我去年写的,当时分析页面用的办法都是比较笨的字符串方法,反正都能用,这里就不修改了。如果有时间,当然也可以尝试用BeautifulSoup,这个包比字符串方法好多了!

网页源码分析:

(1)网页里有50音链接,不过当时笔者并没有用,比较才五十个,了解50音的画写个循环生成个列表很简单的。


(2)热门公司的代码块


当时写这个程序的时候我用了“AVメーカー一覧トップへ”

<a href="/mono/dvd/-/list/=/article=maker/id=5715/" class="bold">ARDEN</a>
这个标签里的id=5715是我们要抓取的信息,此外标签文字是公司的名字。

公司的链接地址形如:http://www.dmm.co.jp/mono/dvd/-/list/=/article=maker/id=5714/,获取了id就可以生成公司的链接啦!

(3)对于收集到的maker,最后写如csv里

不要问我为什么选择csv,那段时间正好在熟练掌握中,其实简单的txt文件就好啦,csv还会碰到写人错误……

有趣的是dmm似乎并没有设置神马反爬虫,所以访问页面没有设置等候,不得不说岛国的网站代码真是清爽!

注:

刚才又跑了一遍文件,因为是在Onedrive文件夹里跑得,遇到了 Permission Error,大概是因为更新文件后遇到了Onedrive的更新,文件访问权限出问题了,移到普通文件夹就没有这个问题啦!


下面是代码,有兴趣直接拿去跑吧(墙内的情况下,如果不想设置代理,那就在VPN环境下跑吧)

#! usr/bin/env python3
# -*- coding:utf-8 -*-

__author__ = '河北省主席'

from urllib import request
import urllib
import chardet
import csv

import time
start = time.clock()

#包含所有maker的50音
japanletter = ['a','i','u','e','o','ka','ki','ku','ke','ko',\
               'sa','si','su','se','so','ta','ti','tu','te','to',\
               'na','ni','nu','ne','no','ha','hi','hu','he','ho',\
               'ma','mi','mu','me','mo','ya','yu','yo',\
               'ra','ri','ru','re','ro','wa','wo']
               
def create_url_letter(letter): #根据50音生成maker分类页
    url_letter = r'http://www.dmm.co.jp/mono/dvd/-/maker/=/keyword='
    url_letter = url_letter + letter + r'/'
    return url_letter

def get_pagedata(url):
    req = request.Request(url)
    req.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 7.0;\
Windows NT 10.0;\ WOW64; Trident/7.0; Touch; .NET4.0C; .NET4.0E;\
.NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0)')
    data = request.urlopen(req).read()
    code = chardet.detect(data).get('encoding')
    pagedata = data.decode(code).encode('utf-8').decode('utf-8')
    return pagedata

def get_maker(pagedata):
    n0 = pagedata.find(r'AVメーカー一覧トップへ')
    n1 = pagedata.find(r'50音順リスト',n0)
    temp = pagedata[n0:n1]
    while temp.find(r'maker-text') != -1:
        n0 = temp.find(r'maker-text')
        t0 = temp.find(r'a href=',n0) + len(r'a href="') #用于定位id
        t0 = temp.find(r'id=',t0)
        t1 = temp.find(r'/',t0)
        n0 = temp.find(r'class="bold"',n0) + len(r'class="bold">')
        n1 = temp.find(r'<',n0)
        maker = temp[n0:n1]
        maker_id = temp[t0:t1]
        #print(maker,maker_id)
        write_maker_info_csv(maker,maker_id)
        temp = temp[n1:]
    while temp.find(r'article=maker') != -1:
        if temp.find(r'メーカー一覧リスト') != -1:
            n0 = temp.find(r'メーカー一覧リスト')
            n0 = temp.find(r'a href=',n0)
        else:
            n0 = temp.find(r'a href=')
        n0 = temp.find(r'>',n0) + len(r'>')
        t0 = temp.find(r'a href=',n0) + len(r'a href="') #用于定位id
        t0 = temp.find(r'id=',t0)
        t1 = temp.find(r'/',t0)
        n1 = temp.find(r'<',n0)
        maker = temp[n0:n1]
        maker_id = temp[t0:t1]
        write_maker_info_csv(maker,maker_id)
        #print(maker,maker_id)
        temp = temp[n1:]

def write_maker_info_csv(maker,maker_id):
    with open('メーカー.csv','a+',newline = '',encoding = 'utf-8') as f:
        writer = csv.writer(f)
        writer.writerow([maker,maker_id])
        f.close()
     
for i in japanletter:
    url = create_url_letter(i)
    pagedata = get_pagedata(url)
    get_maker(pagedata)

print('收集完毕')

end = time.clock()
print('程序运行时间为:%.3f 秒'% (end-start))
请忽略那些不符合规范的文件名。不过现在再看这些代码,当时真是naive啊!现在在写大概会用个requests包和Beautifulsoup,在加个多线程吧。不过一共跑下来1分钟不到,也就不在意了。

最后放上生成的メーカー.csv文件和maker.py文件,用了google drie的网盘。链接:https://drive.google.com/folderview?id=0B61EuLFniasPUXZFN0w5RTFPaTg&usp=sharing



本节结束啦!

PS:最近想找私活,本人Python略懂日语精通,如有需要批量爬取(不太复杂的)数据的需求请联系(QQ:569518379)~

展开阅读全文

没有更多推荐了,返回首页