在许多网页上显示数据并不是服务端一次性返回,而是向服务器单独发送一个或多个异步请求,服务端才会返回JSON格式数据信息。
这种情况下,爬取信息时需要在浏览器中分析Ajax或JS的请求地址,再获取JSON信息。
爬取Ajax数据
Ajax(Asynchronous JavaScript and XML)
,是异步JavaScript
与XML
的组合。其可以在不刷新、不更改页面链接的情况下实现与服务器交换数据并更新网页部分内容。
爬取豆瓣电影数据
url = https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0
选取当前网络请求,点击header
获取网络请求url,cookies
等信息。
滑动网页,并点击加载更多
,得到新的网络请求与请求地址。
观察获取的网络请求地址。
https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0
https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=20
https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=40
发现规律,每页有20条信息"page_limit=20"
,每页开始树为20的倍数"page_start=0、page_start=20、page_start=40"
。
import requests
import requests
import pandas as pd
import numpy as np
import time
class Crawl:
def __init__(self):
#创建随机请求头
from requests_html import UserAgent
user_agent = UserAgent().random
self.header = {"User-Agent": user_agent}
def get_json(self, url):
response = requests.get(url, headers=self.header)
if response.status_code == 200:
response.encoding='utf-8'
return response.json()
else:
print('Get information failed.')
到网页中寻找对应信息。点击Preview
查看预览信息,此时返回的是Json
格式的信息。
data=pd.DataFrame()
base_url = 'https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start={page}'
c = Crawl()
for page in range(0, 41, 20):
print(f'Now if crawl page {page/20 + 1}')
url = base_url.format(page=page)
json_info = c.get_json(url)
infos = json_info["subjects"]
items = []
for info in infos:
item=[]
item.append(info["title"])
item.append(info["rate"])
item.append(info["cover"])
items.append(item)
df = pd.DataFrame(items,columns=['标题','评分','图片地址'])
data=pd.concat([data,df])
time.sleep(np.random.randint(3,6))
print('Over!')
data
的结果如下。