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

来源:互联网 发布:js页面载入事件 编辑:程序博客网 时间:2024/04/30 19:14

长夜漫漫,无心睡眠,您还在漫无目的地找片嘛,您还在手忙较短地查封面嘛,您还在为某些小网站上铺天盖地的小广告发愁嘛……岛国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 requestimport urllibimport chardetimport csvimport timestart = 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_letterdef 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 pagedatadef 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)~

0 0