MTime_Spider_Python动态爬虫
用Chrome分析MTime的影评数据,在网页源码中没有发现票房等相关的数据,基本可以确定是JS动态加载。分析JS中的Ajax相关的文件,有这样的链接:1
http://service.library.mtime.com/Movie.api?Ajax_CallBack=true&Ajax_CallBackType=Mtime.Library.Services&Ajax_CallBackMethod=GetMovieOverviewRating&Ajax_CrossDomain=1&Ajax_RequestUrl=http%3A%2F%2Fmovie.mtime.com%2F251494%2F&t=201849033474578&Ajax_CallBackArgument0=251494
我们可以看到评分和票房数据。
找到链接后,我们需要知道如下两件事:
1. 如何构造链接,参数的特征
2. 如何提取响应的内容
对比分析链接的规律:1
2
3
4http://service.library.mtime.com/Movie.api?Ajax_CallBack=true&Ajax_CallBackType=Mtime.Library.Services&Ajax_CallBackMethod=GetMovieOverviewRating&Ajax_CrossDomain=1&Ajax_RequestUrl=http%3A%2F%2Fmovie.mtime.com%2F251494%2F&t=201849033474578&Ajax_CallBackArgument0=251494
http://service.library.mtime.com/Movie.api?Ajax_CallBack=true&Ajax_CallBackType=Mtime.Library.Services&Ajax_CallBackMethod=GetMovieOverviewRating&Ajax_CrossDomain=1&Ajax_RequestUrl=http%3A%2F%2Fmovie.mtime.com%2F234616%2F&t=20184910482249235&Ajax_CallBackArgument0=234616
分析异同,发现只有三个参数在变化:
1. Ajax_RequestUrl 代表当前网页的链接
2. Ajax_CallBackArgument0 代表链接后面的数字
3. t 时间戳
下面我们看一下网页的响应内容。
1 | 正在上映有票房纪录 |
这三种可以只是多了或者少了一些内容,加个try/except异常处理就可以。
“=”和”;”之间是一个JSON格式,可以用正则匹配然后用json
库解析。
确定要提取的字段,
MovieId, RatingFinal, RDirectorFinal, RPictureFinal,RStoryFinal,ROtherFinal,
Usercount, AttitudeCount, movieTitle, Rank, TotalBoxOffice,TotalBoxOfficeUnit,
TodayBoxOffice, TodayBoxOfficeUnit, ShowDays。
接下来介绍,我们爬虫的架构。
如下
网页下载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#coding: utf-8
import requests
class HtmlDownloader(object):
def download(self, url):
if url is None:
return None
user_agent = ""
headers = {"User-Agent": user_agent}
res = requests.get(url, headers=headers)
if res.status_code == 200:
res.encoding='utf-8'
return res.text
return None网页解析 分为两部分,一个解析电影链接,一个解析动态加载的内容。
1 | class HtmlParser(object): |
- 数据存储器 主要包括连接数据库,建表,插入数据和关闭数据库等操作
1 | class DataOutput(object): |
- 爬虫调度器- 协调上述模块,同时负责构造动态链接。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class SpiderMan(object):
def __init__(self):
self.downloader = HtmlDownloader()
self.parser = HtmlParser()
self.output = DataOutput()
def crawl(self, root_url):
content = self.downloader.download(root_url)
urls = self.parser.parser_url(root_url, content)
#构造一个获取评分和票房的链接
for url in urls:
#print(url)
try:
t = time.strftime("%Y%m%d%H%M%S3282", time.localtime())
rank_url = 'http://service.library.mtime.com/Movie.api' \
'?Ajax_CallBack=true&Ajax_CallBackType=Mtime.Library.Services' \
'&Ajax_CallBackMethod=GetMovieOverviewRating' \
'&Ajax_CrossDomain=1' \
'&Ajax_RequestUrl=%s' \
'&t=%s' \
'&Ajax_CallBackArgument0=%s' % (url[0], t, url[1])
#print(rank_url)
rank_content = self.downloader.download(rank_url)
#print(rank_content)
data = self.parser.parser_json(rank_url, rank_content)
#print(data)
self.output.store_data(data)
print("Crawl Success")
except Exception as e:
print("Crawler failed")
self.output.output_end()
print("Crawl finish")
if __name__ == "__main__":
spider = SpiderMan()
spider.crawl("http://theater.mtime.com/China_Beijing/")
详细的信息和相应的依赖库查看源代码
在命令行运行python mtime_spider.py
即可查看运行结果。
命令行中数据sqlite3 MTime.db
进入数据库,SELECT * FORM MTime
查看数据是否正常插入。
感谢你的时间, (~ ~)