ajax抓取网页内容(2019.02.07例子爬取湖人中文网的微博本文继续学习..Ajax)
优采云 发布时间: 2021-12-04 05:10ajax抓取网页内容(2019.02.07例子爬取湖人中文网的微博本文继续学习..Ajax)
2019.02.07 小白文继续学习...
Ajax,全称是Asynchronous JavaScript and XML,即异步JavaScript和XML。它不是一种编程语言,而是一种使用 JavaScript 与服务器交换数据并更新部分网页的技术,同时确保页面不会被刷新,页面链接不会发生变化。
对于传统的网页,如果要更新其内容,必须刷新整个页面,而使用Ajax,您可以在不完全刷新页面的情况下更新其内容。在这个过程中,页面实际上是在后台与服务器进行交互。获取到数据后,通过JavaScript来改变网页,从而更新网页的内容。
第一个例子
爬上湖人中文网站的微博
本文使用站点:通过分析api完成爬取
更多微博数据提取请看:深夜雨雪:Scrapy爬取所有新浪微博站点
分析请求
打开Ajax的XHR过滤器,然后一直滑动页面加载新的微博内容。如您所见,Ajax 将继续存在
发出请求。
选择其中一个请求,分析其参数信息
请求的参数有4个:type、value、containerid和page(如果没有page,但是since_id,换个浏览器试试)
type永远是uid,value的值是页面链接中的数字,其实就是用户的id。另外还有一个containerid,可以发现是107603加上用户id。改变的值为page,显然这个参数是用来控制分页的,page=1代表第一页
分析响应
此内容为JSON格式,浏览器开发工具自动解析供我们查看。可以看出,最关键的两条信息是cardlistlnfo和cards:前者收录了更重要的信息总数。经过观察,可以发现其实就是微博总数。我们可以根据这个数字估算出页数;另一个是一个列表,它收录10个元素,展开其中一个来看看
可以发现这个元素有一个更重要的字段mblog。展开可以发现,里面收录了一些微博的信息,比如态度数(点赞数)、comments_count(评论数)、reposts_count(转发数)、created at(发帖时间)、text(微博正文)等,而且都是格式化的内容。
这样我们请求一个接口的时候,就可以得到10条微博,请求的时候只需要修改page参数即可。
目录文件
爬虫文件
# -*- coding: utf-8 -*-
import scrapy
import json
from urllib.parse import urlencode
from pyquery import PyQuery as pq
from weibo.items import WeiboItem
class WeibospdSpider(scrapy.Spider):
name = 'weibospd'
allowed_domains = ['m.weibo.cn']
# start_urls = ['http://m.weibo.cn/']
def start_requests(self):
for page in range(1, 11):
base_url = 'https://m.weibo.cn/api/container/getIndex?'
params = {
'type': 'uid',
'value': '5408596403',
'containerid': '1076035408596403',
'page': page
}
url = base_url + urlencode(params)
yield scrapy.Request(url, callback=self.parse)
def parse(self, response):
results = json.loads(response.text)
result= results.get('data').get('cards')
# for result_one in result:
# item = WeiboItem()
# for field in item.fields:
# if field in result_one.get('mblog').keys():
# item[field] = result_one.get('mblog').get(field)
# yield item
for result_one in result:
item = WeiboItem()
a = result_one.get('mblog')
item['id'] = a.get('id')
item['text'] = pq(a.get('text')).text()
item['attitudes_count'] = a.get('attitudes_count')
item['comments_count'] = a.get('comments_count')
item['reposts_count'] = a.get('reposts_count')
yield item
# print(item)
调用urlencode()方法将参数转换为URL GET请求参数,类似type=uid&value=5408596403&containerid=96403&since_id=43363
解析部分本来是打算这样写的
def parse(self, response):
results = json.loads(response.text)
result= results.get('data').get('cards')
for result_one in result:
item = WeiboItem()
for field in item.fields:
if field in result_one.get('mblog').keys():
item[field] = result_one.get('mblog').get(field)
yield item
但是获得的'text'收录HTML标签
所以改成上面的代码,在pyquery的帮助下去掉body中的HTML标签
项目.py
import scrapy
class WeiboItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
id = scrapy.Field()
text = scrapy.Field()
attitudes_count = scrapy.Field()
comments_count = scrapy.Field()
reposts_count = scrapy.Field()
设置.py
ROBOTSTXT_OBEY = False
DEFAULT_REQUEST_HEADERS = {
'Host': 'm.weibo.cn',
'Referer': 'https://m.weibo.cn/u/5408596403',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
}
第二个例子
崔庆才老师的博客使用Scrapy抓取所有知乎用户详细信息并存入MongoDB
崔青才老师写的很详细,不过是2年前完成的。虽然在知乎页面上进行了一些修改,但我还是尝试了。当我抓取他关注的人和关注他的人时,我发现无法获取下一页。