位置:首页 > 进阶教程 > Scrapy爬取百度新闻与Ajax动态内容实战教程

Scrapy爬取百度新闻与Ajax动态内容实战教程

时间:2026-08-21  |  作者:318050  |  阅读:0

crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址

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

我们以百度新闻为列:

1、分析网站

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

image

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

image

接下来得靠抓包分析来破局。启动抓包工具和浏览器后,重点观察网络请求。通过抓包可以看到,这条关键信息其实是 Ajax 动态生成的 JSON 数据。这意味着它并非随 HTML 页面初始加载直接返回,而是页面渲染完成后由脚本动态请求获取的。因此,在页面源代码中根本找不到它的踪迹,传统的静态爬虫自然也无法直接抓取到。

image

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

image

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

image

既然信息并未包含在 JS 包中,我们不妨将视线转向其他类型的请求。观察发现,许多 GET 请求的响应结果正是我们所需的新闻内容。这揭示了一个关键规律:仅首次 Ajax 请求返回了 JSON 数据,而后续的 Ajax 请求返回的则均为 HTML 字符串。

image

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

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

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

http://news.baidu.com/widgetid=LocalNews&ajax=json&t=1501348444467JSON数据的网址http://news.baidu.com/widgetid=civilnews&t=1501348728134html类型的字符串数据网址http://news.baidu.com/widgetid=InternationalNews&t=1501348728196html类型的字符串数据网址

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

http://news.baidu.com/widgetid=civilnews&ajax=json将html类型的字符串数据网址加上JSON数据的网址参数http://news.baidu.com/widgetid=InternationalNews&ajax=json将html类型的字符串数据网址加上JSON数据的网址参数

image

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

crapy实现

#-*-coding:utf-8-*-importscrapyfromscrapy.httpimportRequest,FormRequestimportreimportjsonfromadc.itemsimportAdcItemfromscrapy.selectorimportSelectorclassPachSpider(scrapy.Spider):#定义爬虫类,必须继承scrapy.Spidername='pach'#设置爬虫名称allowed_domains=['news.baidu.com']#爬取域名start_urls=['http://news.baidu.com/widgetid=civilnews&ajax=json']qishiurl=[#的到所有页面id'InternationalNews','FinanceNews','EnterNews','SportNews','AutoNews','HouseNews','InternetNews','InternetPlusNews','TechNews','EduNews','GameNews','DiscoveryNews','HealthNews','LadyNews','SocialNews','MilitaryNews','PicWall']urllieb=[]foriinrange(0,len(qishiurl)):#构造出所有idURLkaishi_url='http://news.baidu.com/widgetid=' qishiurl[i] '&ajax=json'urllieb.append(kaishi_url)#print(urllieb)defparse(self,response):#选项所有连接forjinrange(0,len(self.urllieb)):a='正在处理第%s个栏目:url地址是:%s'%(j,self.urllieb[j])yieldscrapy.Request(url=self.urllieb[j],callback=self.enxt)#每次循环到的url添加爬虫defenxt(self,response):neir=response.body.decode("utf-8")pat2='"m_url":"(.*)"'url=re.compile(pat2,re.S).findall(neir)#通过正则获取爬取页面的URLforkinrange(0,len(url)):zf_url=url[k]url_zf=re.sub("/","/",zf_url)pduan=url_zf.find('http://')ifpduan==0:print(url_zf)#输出获取到的所有url

【转载自:http://www.lqkweb.com】

来源:整理自互联网
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多