爬取ajax加载的豆瓣电影

(一)前提:找到ajax异步加载的包接口,注意第一个电影名

 我们把Request URL网址复制到地址栏得到:

上图是json格式数据,且第一个电影一致,说明我们找到了正确的ajax的json接口

出现加载更多之前是20部电影,点击加载更多,我们会得到第二个json包,里面是另外20个电影。

(二)爬取豆瓣中美剧分类的电影200个第一种方式(最后优化):

多加载几个json接口,找url规律

对json接口找规律,for循环拿到各json数据的url接口进行访问,把需要内容存入txt

import requests

# url2 = "https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start=20&countries=%E7%BE%8E%E5%9B%BD"
# url3= "https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start=40&countries=%E7%BE%8E%E5%9B%BD"
# url = "https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start={}&countries=%E7%BE%8E%E5%9B%BD".format({(n-1)*20})
# response = requests.post(url2)
# print(response.json())

for page in range(1,11,1):
    url = "https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start={}&countries=%E7%BE%8E%E5%9B%BD".format((page-1)*20)
    # print(url)
    response = requests.get(url)
    # #
    # print(response.json())
    for item in response.json()['data']:
        title = item['title']
        with open('movie.txt','a',encoding='utf-8') as f:
            f.write(title+'\n')

 结果循环十次,每次20个正好200条:

 (二)优化

我们抓取数据争取一次访问url就拿到全部数据才是王道:

url的问号后面都是参数,我们用字典传就是了

点击分类中的美国,找到json接口

 抓规律发现:参数中都有range和start这两个,与预期不符的是,观察多个json包后发先只有start在变,差是20

#点击分类中的美国找到的第一个接口
url1 = 'https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start=0&countries=%E7%BE%8E%E5%9B%BD'

#点击加载更多得到的json接口
url2 = 'https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start=20&countries=%E7%BE%8E%E5%9B%BD'

我们来动态改变它爬取600个电影吧!但是搞了半天没实现能一次连接读取拿到所有数据

但是有一个重大发现!

上图中没有limit键,我大胆加上了如下:(参数都可以改着试试,比如换成英国啥的都行)

完整代码如下:

import requests
url = 'https://movie.douban.com/j/new_search_subjects'
index = 0
data_dic = {
    'sort' : 'U',
    'limit':'500',
    'tags':'',
    'start':'0',
    'countries': '美国'
}
response = requests.get(url,data_dic)

for item in response.json()['data']:
    title = item['title']
    with open('movie.txt','a',encoding='utf-8') as f:
        f.write(title+'\n')

结果:

猜你喜欢

转载自blog.csdn.net/sinat_38068807/article/details/89577009