使用Scrapy,共爬取362622
条影视信息。其中电影139784
条,电视剧综艺等222838
条。
首先通过年份标签 https://www.douban.com/tag/2016/?focus=movie 页面中的XHRAPI获取从1888年到现在的一些电影作为seeds。 然后爬取每个电影详情页面中的推荐电影,最后通过演职人员参与的作品进行查漏。
MIT License
Switch to multiprocessing, and the amount is the same, 80608.
Got 80608
entries using threadpool.
But encountered the same bug as all3g did.
It may have lost some entries due to this bug.
主要是通过AJAX
来获取电影信息,因为直接访问HTML源码太花时间了。而且直接访问API
跟直接访问网页的被封概率应该不一样吧?
首先通过tag
搜索已有年份标签的电影,范围为[1888,current_year]
http://www.douban.com/tag/2015/?focus=movie
上面是获取The URL of AJAX
的链接,在调试窗口就可以看到其链接为
http://www.douban.com/j/tag/items?start=9&limit=6&topic_id=65330&topic_name=2015&mod=movie
通过limit
可以控制每次返回数据量。
可以发现,该链接中含有topic_id
字段,这个id是未知的,因此只好到标签搜索结果的HTML
源码中找。有时候可以在源码中直接找到payload
信息,然后从中提取topic_id
,但是有时候找不到。找不到时,可以获取下面的js
文件,在其中可以找到payload
信息。
有且只有一个匹配
pattern=scrapy
从js文件提取或直接从HTML源码获取
var payload = {
start: start,
limit: limit,
topic_id: 65330,
topic_name: '2015',
mod: mod_name
};
Request Header
:
'Accept':'*/*',
'Accept-Encoding':'gzip, deflate, sdch',
'Accept-Language':'en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4',
'Connection':'keep-alive',
'Referer':scrapy,
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36',
'X-Requested-With':'XMLHttpRequest'
其中Referer
是变化的。为了最真实的模拟浏览器的请求,这些Headers
都会包含在请求中。
此法可以获取电影(或电视剧、动画等)的subject_id
,然后访问详情页进一步爬取信息。
在XHR
返回的json数据中提取id:
ptn = scrapy
然而有的电影并没有年份标签,因此可以获取到电影的演员列表,然后再获取演员参演过的电影来查漏。作品列表仍然不全,若不是主角可能被忽略。而且国外演员被标签的不全。
http://www.douban.com/tag/苏有朋/?focus=movie
因此可以直接进入演员详情页,演员id可以在获取演员列表时获取。(主演一般都有链接,链接中包含id)
http://movie.douban.com/celebrity/1050540/movies?start=0&format=pic&sortby=time&role=A
这东西是翻页的,每次都会请求HTML
源码。每页10条,总条数可以从源码获取。比如下面的。不过感觉会好慢好慢。而且会不会要求登陆?
<title>
苏有朋 Alec Su的演出作品(47)
</title>
有些条目不登陆不显示,比如蓝宇。用XHR
的API
倒是爬到其链接了,但是要爬详情时还是得进入详情页,因而后续有搞个小号登陆的必要。