scrapy实战4抓取ajax动态页面(以糗事百科APP为例子):

一般来说爬虫类框架抓取Ajax动态页面都是通过一些第三方的webkit库去手动执行html页面中的js代码, 最后将生产的html代码交给spider分析。本篇文章则是通过利用fiddler抓包获取json数据分析Ajax页面的具体请求内容,找到获取数据的接口url,直接调用该接口获取数据,省去了引入python-webkit库的麻烦,而且由于一般ajax请求的数据都是结构化数据,这样更省去了我们利用xpath解析html的痛苦。

手机打开糗事百科APP ,利用fiddler抓包获取json数据 检查 得到的接口url是否能正常访问 如果能访问在换个浏览器试试 如图

打开之后的json数据如图推荐用json—handle插件(chrome安装)打开

代码实现:以100页为例

items.py

 1 import scrapy
 2
 3
 4 class QiushibalkeItem(scrapy.Item):
 5     # define the fields for your item here like:
 6     # name = scrapy.Field()
 7     uid=scrapy.Field()
 8     nickname = scrapy.Field()
 9     gender=scrapy.Field()
10
11     astrology=scrapy.Field()
12
13     content=scrapy.Field()
14     crawl_time=scrapy.Field()

spiders/qiushi.py

 1 # -*- coding: utf-8 -*-
 2 import scrapy
 3 import json
 4 from qiushibalke.items import QiushibalkeItem
 5 from datetime import datetime
 6 class QiushiSpider(scrapy.Spider):
 7     name = "qiushi"
 8     allowed_domains = ["m2.qiushibaike.com"]
 9     def start_requests(self):
10         for i in range(1,100):
11             url = "https://m2.qiushibaike.com/article/list/text?page={}".format(i)
12             yield scrapy.Request(url,callback=self.parse_item)
13
14
15     def parse_item(self, response):
16         datas = json.loads(response.text)["items"]
17         print(datas)
18         for data in datas:
19             # print(data[‘votes‘][‘up‘])
20             # print(data[‘user‘][‘uid‘])
21             # print(data[‘user‘]["login"])
22             # print(data[‘user‘]["gender"])
23             # print(data[‘user‘]["astrology"])
24
25             item = QiushibalkeItem()
26             item["uid"]= data[‘user‘]["uid"]
27
28             item["nickname"] = data[‘user‘]["login"]
29             item["gender"] = data[‘user‘]["gender"]
30
31             item["astrology"] = data[‘user‘]["astrology"]
32             item["content"]=data["content"]
33             item["crawl_time"] = datetime.now()
34
35             yield item
36     

pipelines.py

import pymysql
class QiushibalkePipeline(object):
    def process_item(self, item, spider):
        con = pymysql.connect(host="127.0.0.1", user="youusername", passwd="youpassword", db="qiushi", charset="utf8")
        cur = con.cursor()
        sql = ("insert into baike(uid,nickname,gender,astrology,content,crawl_time)"
               "VALUES(%s,%s,%s,%s,%s,%s)")
        lis = (item["uid"],item["nickname"],item["gender"],item["astrology"],item["content"],item["crawl_time"])
        cur.execute(sql, lis)
        con.commit()
        cur.close()
        con.close()

        return item

settings.py

 1 BOT_NAME = ‘qiushibalke‘
 2
 3 SPIDER_MODULES = [‘qiushibalke.spiders‘]
 4 NEWSPIDER_MODULE = ‘qiushibalke.spiders‘
 5 ROBOTSTXT_OBEY = False
 6 DOWNLOAD_DELAY = 5
 7 COOKIES_ENABLED = False
 8 DEFAULT_REQUEST_HEADERS = {
 9     "User-Agent":"qiushibalke_10.13.0_WIFI_auto_7",
10 #   ‘Accept‘: ‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8‘,
11 #   ‘Accept-Language‘: ‘en‘,
12 }
13 ITEM_PIPELINES = {
14     ‘qiushibalke.pipelines.QiushibalkePipeline‘: 300,
15     #   ‘scrapy_redis.pipelines.RedisPipeline‘:300,
16 }

数据如图:

时间: 2024-10-20 04:21:09

scrapy实战4抓取ajax动态页面(以糗事百科APP为例子):的相关文章

芝麻HTTP:Python爬虫实战之爬取糗事百科段子

首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致之前的代码没法用了,会导致无法输出和CPU占用过高的情况,是因为正则表达式没有匹配到的缘故. 现在,博主已经对程序进行了重新修改,代码亲测可用,包括截图和说明,之前一直在忙所以没有及时更新,望大家海涵! 更新时间:2015/8/2 糗事百科又又又又改版了,博主已经没心再去一次次匹配它了,如果大家遇到长时间运行不出结果也不报错的情况,请大家参考最新的评

python—多协程爬取糗事百科热图

今天在使用正则表达式时未能解决实际问题,于是使用bs4库完成匹配,通过反复测试,最终解决了实际的问题,加深了对bs4.BeautifulSoup模块的理解. 爬取流程 前奏: 分析糗事百科热图板块的网址,因为要进行翻页爬取内容,所以分析不同页码的网址信息是必要的 具体步骤: 1,获取网页内容(urllib.request)# 糗事百科有发爬虫技术,所以要添加headers,伪装程浏览器 2,解析网页内容,获取图片链接(from bs4 import BeautifulSoup) 3,通过图片链接

web爬虫讲解—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多网站,当你浏览器访问时看到的信息,在html源文件里却找不到,由得信息还是滚动条滚动到对应的位置后才显示信息,那么这种一般都是 js 的 Ajax 动态请求生成的信息 我们以百度新闻为列: 1.分析网站 首先我们浏览器打开百度新闻,在网页中间部分找一条新闻信息 然后查看源码,看看在源码里是否有这条新闻,可以看到源文件里没有这条信息,这种情况爬虫是无法爬取到信息的 那么我们就需要抓包分析了,启动抓包软件和抓包

第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

第三百三十四节,web爬虫讲解2-Scrapy框架爬虫-Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻标题和rul地址 有多网站,当你浏览器访问时看到的信息,在html源文件里却找不到,由得信息还是滚动条滚动到对应的位置后才显示信息,那么这种一般都是 js 的 Ajax 动态请求生成的信息 我们以百度新闻为列: 1.分析网站 首先我们浏览器打开百度新闻,在网页中间部分找一条新闻信息 然后查看源码,看看在源码里是否有

Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容

在上一篇python使用xslt提取网页数据中,要提取的内容是直接从网页的source code里拿到的. 但是对于一些Ajax或动态html, 很多时候要提取的内容是在source code找不到的,这种情况就要想办法把异步或动态加载的内容提取出来. python中可以使用selenium执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据.selenium自己不带浏览器,可以使用第三方浏览器如Firefox, Chrome等,也可以使用headless浏览器如P

用C#抓取AJAX页面的内容

现在的网页有相当一部分是采用了AJAX技术,不管是采用C#中的WebClient还是HttpRequest都得不到正确的结果,因为这些脚本是在服务器发送完毕后才执行的! 但我们用IE浏览页面时是正常的,所以解决方法只有1个就是采用WebBrowser控件 但是使用Webbrowser你会发现,在DownloadComplete事件中,你根本无法知道页面何时才算是真正的加载完毕! 当然个别有Frame的网页可能会触发多次Complete,即使你采用计数器的办法,即在Navigated事件中++,而

python爬取ajax动态生成的数据 以抓取淘宝评论为例子

在学习python的时候,一定会遇到网站内容是通过ajax动态请求.异步刷新生成的json数据的情况,并且通过python使用之前爬取静态网页内容的方式是不可以实现的,所以这篇文章将要讲述如果在python中爬取ajax动态生成的数据. 至于读取静态网页内容的方式,有兴趣的可以查看博客内容. 这里我们以爬取淘宝评论为例子讲解一下如何去做到的. 这里主要分为了四步: 一 获取淘宝评论时,ajax请求链接(url) 二 获取该ajax请求返回的json数据 三 使用python解析json数据 四

C#抓取AJAX页面的内容

原文 C#抓取AJAX页面的内容 现在的网页有相当一部分是采用了AJAX技术,所谓的AJAX技术简单一点讲就是事件驱动吧(当然这种说法可能很不全面),在你提交了URL后,服务器发给你的并不是所有是页面内容,而有一大部分是JS脚本,即用<JAVASCRIPT标签表示的,这其中有些是链接了外部的JS文件,有些是内置的JS脚本,这些脚本是在客户端加载了服务器发回来的源码后才执行的,所以不管是采用C#中的WebClient还是HttpRequest都得不到正确的结果,因为这些脚本是在服务器发送完毕后才执

爬取Ajax动态加载网页

常见的反爬机制及处理方式 1.Headers反爬虫 :Cookie.Referer.User-Agent 解决方案: 通过F12获取headers,传给requests.get()方法 2.IP限制 :网站根据IP地址访问频率进行反爬,短时间内进制IP访问 解决方案: 1.构造自己IP代理池,每次访问随机选择代理,经常更新代理池 2.购买开放代理或私密代理IP 3.降低爬取的速度 3.User-Agent限制 :类似于IP限制 解决方案: 构造自己的User-Agent池,每次访问随机选择 5.