Python爬虫之爬取动态页面数据

很多网站通常会用到Ajax和动态HTML技术,因而只是使用基于静态页面爬取的方法是行不通的。对于动态网站信息的爬取需要使用另外的一些方法。

先看看如何分辨网站时静态的还是动态的,正常而言含有“查看更多”字样或者打开网站时下拉才会加载内容出来的进本都是动态的,简便的方法就是在浏览器中查看页面相应的内容、当在查看页面源代码时找不到该内容时就可以确定该页面使用了动态技术。

对于动态页面信息的爬取,一般分为两种方法,一种是直接从JavaScript中采集加载的数据、需要自己去手动分析Ajax请求来进行信息的采集,另一种是直接从浏览器中采集已经加载好的数据、即可以使用无界面的浏览器如PhantomJS来解析JavaScript。


1、直接从JavaScript中采集加载的数据

示例1——爬取MTime影评信息:

随便打开一个电影的URL:http://movie.mtime.com/99547/


一开始出现转圈的加载,即可判断是动态加载的。


关注到“票房”这里:



查看源代码并找不到票房的字样:


因此可断定该内容是使用Ajax异步加载生成的。


打开FireBug,在“网络”>“JavaScript”中查看含有敏感字符的接口链接,因为是和电影相关的,就先查看含有“Movie.api?Ajax_Callback=......”字样的链接,可以查看到其中一个含有影评和票房等信息:



为了进行确认哪些参数是会变化的,再打开一个新的电影的URL并进行相同的操作进行查看:



为了方便,直接上BurpSuite的Compare模块进行比较:


可以直接看到,只有以上三个参数的值是不一样的,其余的都是相同的。其中Ajax_RequestUrl参数值为当前movie的URL,t的值为当前时间,Ajax_CallBackArgument0的值为当前电影的序号、即其URL中后面的数字。

因此就可以构造Ajax请求的URL来爬取数据,回到top 100的主页http://www.mtime.com/top/movie/top100/,分析其中的标签等然后编写代码遍历top 100所有的电影相关票房和影评信息,注意的是并不是所有的电影都有票房信息,这里需要判断即可。

代码如下:

#coding=utf-8
import requests
import re
import time
import json
from bs4 import BeautifulSoup as BS
import sys
reload(sys)
sys.setdefaultencoding('utf8')

headers = {
	'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36',
}

def Get_Movie_URL():
	urls = []
	for i in range(1,11):
		# 第一页的URL是不一样的,需要另外进行处理
		if i != 1:
			url = "http://www.mtime.com/top/movie/top100/index-%d.html" % i
		else:
			url = "http://www.mtime.com/top/movie/top100/"
		r = requests.get(url=url,headers=headers)
		soup = BS(r.text,'lxml')
		movies = soup.find_all(name='a',attrs={'target':'_blank','href':re.compile('http://movie.mtime.com/(\d+)/'),'class':not None})
		for m in movies:
			urls.append(m.get('href'))
	return urls

def Create_Ajax_URL(url):
	movie_id = url.split('/')[-2]
	t = time.strftime("%Y%m%d%H%M%S0368", time.localtime())
	ajax_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,t,movie_id)
	return ajax_url

def Crawl(ajax_url):
	r = requests.get(url=ajax_url,headers=headers)
	if r.status_code == 200:
		r.encoding = 'utf-8'
		result = re.findall(r'=(.*?);',r.text)[0]
		if result is not None:
			value = json.loads(result)

			movieTitle = value.get('value').get('movieTitle')
			TopListName = value.get('value').get('topList').get('TopListName')
			Ranking = value.get('value').get('topList').get('Ranking')
			movieRating = value.get('value').get('movieRating')
			RatingFinal = movieRating.get('RatingFinal')
			RDirectorFinal = movieRating.get('RDirectorFinal')
			ROtherFinal = movieRating.get('ROtherFinal')
			RPictureFinal = movieRating.get('RPictureFinal')
			RStoryFinal = movieRating.get('RStoryFinal')
			print movieTitle
			if value.get('value').get('boxOffice'):
				TotalBoxOffice = value.get('value').get('boxOffice').get('TotalBoxOffice')
				TotalBoxOfficeUnit = value.get('value').get('boxOffice').get('TotalBoxOfficeUnit')
				print '票房:%s%s' % (TotalBoxOffice,TotalBoxOfficeUnit)
			print '%
  • 17
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
Python爬虫是一种用于从网页上获取数据的技术。实时爬取天气数据可以通过以下步骤实现: 1. 导入所需的库:首先,需要导入Python的requests库和BeautifulSoup库。Requests库用于发送HTTP请求,而BeautifulSoup库用于解析HTML页面。 2. 发送HTTP请求:使用requests库发送GET请求到天气数据的网站。可以使用城市名称或者经纬度作为参数来获取相应城市的天气数据。 3. 解析HTML页面:使用BeautifulSoup库解析返回的HTML页面。可以使用CSS选择器或XPath来定位所需的天气数据。 4. 提取天气数据:根据HTML页面的结构,提取所需的天气数据。可以使用BeautifulSoup提供的方法来提取标签内的文本内容。 5. 处理和展示数据:对提取到的天气数据进行处理和展示。可以将数据保存到文件中或者通过其他方式展示给用户。 以下是一个简单的示例代码,用于实时爬取天气数据: ```python import requests from bs4 import BeautifulSoup def get_weather(city): url = f'https://www.weather.com.cn/weather/{city}.shtml' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36' } response = requests.get(url, headers=headers) response.encoding = 'utf-8' soup = BeautifulSoup(response.text, 'html.parser') weather = soup.find(class_='tem').text.strip() return weather city = '101010100' # 北京的城市代码 weather_data = get_weather(city) print(f"北京的实时天气为:{weather_data}") ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值