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

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

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

有多网站,当你浏览器访问时看到的信息,在HTML源文件里却找不到,由得信息还是滚动条滚动到对应的位置后才显示信息,那么这种一般都是 Js 的 AJAX 动态请求生成的信息

我们以百度新闻为列:

1、分析网站

首先我们浏览器打开百度新闻,在网页中间部分找一条新闻信息

然后查看源码,看看在源码里是否有这条新闻,可以看到源文件里没有这条信息,这种情况爬虫是无法爬取到信息的

那么我们就需要抓包分析了,启动抓包软件和抓包浏览器,前后有说过软件了,就不在说了,此时我们经过抓包看到这条信息是通过AJAX动态生成的JsON数据,也就是说,当HTML页面加载完成后才生成的,所有我们在源文件里无法找到,当然爬虫也找不到

如果你依然在编程的世界里迷茫,可以加入我们的Python学习扣qun:784758214,看看前辈们是如何学习的。交流经验。从基础的python脚本到web开发、爬虫、django、数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!分享一些学习的方法和需要注意的小细节,点击加入我们的 python学习者聚集地

我们首先将这个JsON数据网址拿出来,到浏览器看看,我们需要的数据是不是全部在里面,此时我们看到这次请求里只有 17条信息,显然我们需要的信息不是完全在里面,还得继续看看其他Js包

我们将抓包浏览器滚动条拉到底,以便触发所有Js请求,然后在继续找Js包,我们将所有Js包都找完了再也没看到新闻信息的包了

那信息就不在Js包里了,我们回头在看看其他类型的请求,此时我们看到很多get请求响应的是我们需要的新闻信息,说明只有第一次那个AJAX请求返回的JsON数据,后面的AJAX请求返回的都是HTML类型的字符串数据,

我们将AJAX请求返回的JsON数据的网址和AJAX请求返回HTML类型的字符串数据网址,拿来做一下比较看看是否能找到一定规律,

此时我们可以看到,JsON数据的网址和HTML类型的字符串数据网址是一个请求地址,

只是请求时传递的参数不一样而已,那么说明无论返回的什么类型的数据,都是在一个请求地址处理的,只是根据不同的传参返回不同类型的数据而已

http://news.baIDu.com/Widget?ID=LocalNews&AJAX=Json&t=1501348444467   JsON数据的网址http://news.baIDu.com/Widget?ID=civilnews&t=1501348728134        HTML类型的字符串数据网址http://news.baIDu.com/Widget?ID=InternationalNews&t=1501348728196    HTML类型的字符串数据网址

我们可以将HTML类型的字符串数据网址加上JsON数据的网址参数,那是否会返回JsON数据类型?试一试,果然成功了

http://news.baIDu.com/Widget?ID=civilnews&AJAX=Json        将HTML类型的字符串数据网址加上JsON数据的网址参数http://news.baIDu.com/Widget?ID=InternationalNews&AJAX=Json    将HTML类型的字符串数据网址加上JsON数据的网址参数

这下就好办了,找到所有的HTML类型的字符串数据网址,按照上面的方法将其转换成JsON数据的网址,然后循环的去访问转换后的JsON数据的网址,就可以拿到所有新闻的URL地址了

crapy实现

# -*- Coding: utf-8 -*-import scrapyfrom scrapy.http import Request,FormRequestimport reimport Jsonfrom adc.items import AdcItemfrom scrapy.selector import Selectorclass PachSpIDer(scrapy.SpIDer):                            #定义爬虫类,必须继承scrapy.SpIDer    name = ‘pach‘                                           #设置爬虫名称    allowed_domains = [‘news.baIDu.com‘]                    #爬取域名    start_urls = [‘http://news.baIDu.com/Widget?ID=civilnews&AJAX=Json‘]    qishiurl = [                    #的到所有页面ID        ‘InternationalNews‘,‘FinanceNews‘,‘EnterNews‘,‘SportNews‘,‘autoNews‘,‘HouseNews‘,‘InternetNews‘,‘InternetPlusNews‘,‘TechNews‘,‘EduNews‘,‘GameNews‘,‘discoveryNews‘,‘HealthNews‘,‘LadyNews‘,‘SocialNews‘,‘MilitaryNews‘,‘PicWall‘    ]    urllIEb = []    for i in range(0,len(qishiurl)):            #构造出所有IDURL        kaishi_url = ‘http://news.baIDu.com/Widget?ID=‘ + qishiurl[i] + ‘&AJAX=Json‘        urllIEb.append(kaishi_url)    # print(urllIEb)    def parse(self,response):                  #选项所有连接        for j in range(0,len(self.urllIEb)):            a = ‘正在处理第%s个栏目:URL地址是:%s‘ % (j,self.urllIEb[j])            yIEld scrapy.Request(url=self.urllIEb[j],callback=self.enxt)     #每次循环到的url 添加爬虫    def enxt(self,response):        neir = response.body.decode("utf-8")        pat2 = ‘"m_url":"(.*?)"‘        url = re.compile(pat2,re.S).findall(neir)      #通过正则获取爬取页面 的URL        for k in range(0,len(url)):            zf_url = url[k]            url_zf = re.sub("\\/","/",zf_url)            pduan = url_zf.find(‘http://‘)            if pduan == 0:                print(url_zf)                       #输出获取到的所有urlPython资源分享qun 784758214,内有安装包,pdf,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎
总结

以上是内存溢出为你收集整理的web爬虫讲解—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息全部内容,希望文章能够帮你解决web爬虫讲解—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1036534.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-24
下一篇2022-05-24

发表评论

登录后才能评论

评论列表(0条)

    保存