首先我们使用requests库来实际操作一下
# https://spa1.scrape.center/
import requests url = 'https://spa1.scrape.center/' html = requests.get(url).text print(html)
运行结果:
这里我们虽然能够成功获得返回的html文本,但是对比实际网站我们就会发现事情远远没有那么简单:
对比网站上的内容就会发现我们没有在返回的html中发现任何的电影信息。
对于以上情况,就说明该网页使用了JavaScript渲染的技术之后得到的。这个时候若要爬取页面的电影信息我们需要调用Ajax数据接口,以实现对动态渲染之后的页面的爬取。
这时我们首先要对页面进行分析:
再进行下一页操作之后,可以看到比较明显两个参数:limit与offset
查看每一个响应的preview选项卡,可以看到我们所需的信息就隐藏在这里!
就想捉迷藏一样,看到它的下一步,就是把他们抓住了。
import requests
import logging
# 调用logging库进行程序日志的打印输出,以便对爬虫进程的监督
# 设定追踪日志的等级为 info 并设定格式化输入的格式
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s : %(message)s')
# 构造一个待引用的格式化URL字符串
index_url = 'https://spa1.scrape.center/api/movie/?limit={limit}&offset={offset}'
# 定义一个爬取时的通用函数
def scrape_api(url):
logging.info('爬取中 %s ...', url)
try:
response = requests.get(url)
# 如果成功响应则返回json文本
if response.status_code == 200:
return response.json()
logging.error('get invalid status code %s while scraping url: %s', response.status_code, url)
except:
logging.error('爬取url : %s 时出现错误!', url)
limit = 10
# 定义一个爬取时的控制页的函数:
def scrape_index(page):
# 这里的limit与offset就是我们之前分析的两个字段,
# limit 代表一页中的条数 offset 代表累计显示的条数。所以我们很容易得出两个字段在页码增加时的关系
url = index_url.format(limit=limit, offset=limit*(page - 1))
return scrape_api(url)
# 最后我们调用构造好的函数,进行爬取
# 我们会发现若想要获取一个电影的详细数据还需要知道她的id
# 构造一个能够依照id进行爬去的函数
default = 'https://spa1.scrape.center/api/movie/{id}'
def scarp_detail(id):
url = default.format(id=id)
return scrape_api(url)
total_page = 10
# 定义主函,使得所有的操作在主函数内执行
def main():
for page in range(1, total_page):
# 先获取一页的信息
index_data = scrape_index(page)
# 在对每一页的具体某一电影的详细信息进行爬去
# 因为所有的电影被放在results字段中,所以使用get方法获取results字段
for item in index_data.get('results'):
id = item.get('id')
movie_data = scarp_detail(id)
logging.info('对于爬取的每一个电影 其详情信息如下:%s',movie_data)
if __name__ == "__main__":
main()
运行结果:
至此我们通过requests请求成功获得了Ajax处理过的数据。
是不是非常有成就感!
下图为对于logging日志追踪信息的级别的分类,在上例中我们追踪的是info,也就是只有程序正常进行时被记录的日志:
今日结束,未完待续…



