【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)~
- 【Python3】【老司机系列】日本dmm网站抓取(一)
- Python3 爬虫(一)-- 简单网页抓取
- Python3 爬虫(一)-- 简单网页抓取
- Python3模块详解--老司机工具urllib模块详解
- Python3 简单抓取网站url
- 河马搞笑GIF动态图网站(http://gif.hemaj.com)上线,老司机快上车!
- 使用Ajax抓取远程网页源代码并抓取其中图片【老司机不须再用】
- 老司机带你玩转git(一)本地和远程仓库
- 老司机带你玩转linux(一)shell入门
- 小白跟老司机学网站搭建
- 老司机程序员用到的各种网站整理
- Angularjs 入门 (老司机开车版)
- git 技巧(老司机也需要)
- Python3爬虫(一)抓取网页的html
- DB2 老笔记系列(一)
- 一名程序员老司机在工作中的一点总结
- Python3模块详解--老司机工具urllib模块详解之urllib.request子模块
- Python3模块详解--老司机工具urllib模块详解之urllib.error子模块
- OPENSSL——菜鸟的问题记录
- c中printf的输出问题
- vim详细说明和配置
- 《精通nginx》的两个疑问
- Flume1.7.0的TaildirSource介绍
- 【Python3】【老司机系列】日本dmm网站抓取(一)
- 由Android Toast 到 ThreadLocal的思考
- ArrayDeque源码解析
- 深度学习史上最全总结(文末有福利)
- InheritableThreadLocal用法与ThreadLocal的区别
- 可以直接获取id对象
- 判断number时最好用正则
- 中国剩余定理
- 小知识(1)