由于豆瓣里的电影都有专属的id,获取到id后可以进一步爬取其他页面的内容。
首先来到主界面(https://movie.douban.com)观察网页:
点击“选电影”进入需要爬取的界面:
打开Chrome开发模式,并下拉网页观察新生成的文件
可以观察到页面没有跳转,说明该网页采用了异步加载技术,同时生成的主文件为以search_subjects开头的文件
文件页面的url:
通过点击Response选项观察到页面中内容的数据格式为json格式:
因此直接访问主内容所在网页(https://movie.douban.com/j/search_subjects?type=movie&tag=华语&sort=recommend&page_limit=20&page_start=0)
可以观察到如下内容:
通过更改url中的数字page_start=(以20为单位)跳转到下一页
可以看到这里有很多内容,我选择爬取的是其中的电影名、id号及电影评分。同时观察到主url是有变化的,根据电影类别发生变化,因此我选择分四次爬取内容,分别为:华语、欧美、韩国、日本,这样获取的电影内容就没有重复了。
好了,接下来直接上代码。
import json
import requests
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
def get_url(url):
res=requests.get(url,headers=headers)
json_data=json.loads(res.text)
films=json_data.get('subjects')
for film in films:
try:
f.write(film['id']+'\t'+film['rate']+'\t'+film['title']+'\n')
except:
f.write('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'+'\n')
print(film['id'])
pass
if __name__=='__main__':
urls=['https://movie.douban.com/j/search_subjects?type=movie&tag=%E6%97%A5%E6%9C%AC&sort=recommend&page_limit=20&page_start={}'.format(str(i)) for i in range(0,220,20)]#在这里我爬取的是日语的电影
f=open('douban.txt','a+')
for url in urls:
get_url(url)
f.close()
在爬取日本电影内容时程序报错而中断,因此加入了try语句使程序继续进行的同时显示出错误的url。最后发现27171119这个电影id在爬取时出现了错误,打开https://movie.douban.com/subject/27171119/网页看到电影名竟然是:
好吧,这样的电影名里面的字符在写入txt文档时会产生编码错误,可以手工输入将其重新添加。
最后得到的内容为:
好了,就到这里了,有空我会写下一步利用id爬取的内容。