ajax抓取网页内容(2019.02.07例子爬取湖人中文网的微博本文继续学习..Ajax)

优采云 发布时间: 2021-12-04 05:10

  ajax抓取网页内容(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年前完成的。虽然在知乎页面上进行了一些修改,但我还是尝试了。当我抓取他关注的人和关注他的人时,我发现无法获取下一页。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线