爬取动态网页时遇上的难点

2019-12-12 08:12栏目:编程
TAG:

bob体育平台 1

 

我对java代码熟悉一点,用java编写了一个小软件提供给那些不会代码或者懒癌玩家使用,同时提供了定时,秒杀等等功能。GitHub地址:NetRobot

 

bob体育平台 2

bob体育平台 3浏览器自带工具

 

      我爬去的网站是这个小米6x(4GB RAM)点评bob体育平台,,当你点开网站点击下一页,再看看对应的url地址都是一样的没有变化,再看看对应的源代码发现都是一样的,只显示第一页的评论内容,第2,3,4....内容无法找到。开始找网站被隐藏的url参数部分。我用的浏览器时谷歌Chrome浏览器,按F12打开开发者选项,打开找到最上面导航栏network,下面选择All,筛选网页文件类型,这里也可选XHR表示动态网页类型,选择右边的preview来展示网页的内容用来确定我们要找的网页,

bob体育平台 4cookie

399

 

打开我们的网络请求软件,将这三个参数依次复制进去(记得点击view source后复制原始文字),我们更换一下aid,这里随便找了个视频,aid=33615324,点击一下测试按钮发送一次网络请求,结果如下:

bob体育app,不知道有没有小哥哥、小姐姐喜欢cosplay的,今天小编就分享一个关于爬取cosplay图片,emmmm,先来几张图活跃一下气氛!

       准备爬取太平洋网上的小米手机的评论,因为发现评论已经自动打好标签了,并且对于手机的几种性能表现也打了分,以及详细的评论都有,对于后面自己的工作有帮助,所以就准备爬取这些评论.但发现这个网站的每次点下一页都是相同的URL地址,也就是说源代码只显示第一页的评论内容,对于用requests来爬取网页内容,用这个地址的话无法爬取更多内容。后来查了一下,这是用了Ajax动态加载技术,专门用来动态加载网页内容,实现网页的异步更新。

举一个bilibili投硬币的例子,这个例子是比较常见的POST请求。看一下当我们想要给喜欢的视频投硬币,到底是怎么进行的网络请求。

 

bob体育平台 5

首先随便加入一个东西到购物车,我们可以看见请求的参数是Query String Parameters,而并没有form data,说明这个方式是将参数拼接在目标网址后面的。

bob体育平台 6

我们点击最左侧网页中的下一页就会在边上的对应文件中找到这个网页的代码文件信息,通过preview可以看见这个文件的预览。当我们找到要找的网页时,在点击headers找到我们所要的信息。

首先有一个Request URL,就是前面提到的请求目标api,这个操作就是向这个网址发起post请求。

3.tag_id:

 1 from bs4 import BeautifulSoup
 2 import requests
 3 import re
 4 import pandas as pd
 5 
 6 #太平洋网爬取小米6X的评论
 7 #动态网页爬取(ajax)
 8 
 9 
10 def getHtml(url,data): #只输入URL的主体部分,后面的参数用下面的字典附加上
11     try:
12         r=requests.get(url,params=data)
13         r.raise_for_status()
14         r.encoding=r.apparent_encoding
15         return r.text
16     except:
17         print('爬取失败')
18 
19 def getComment(html):#获得一页的评论
20     commentList=[]
21     soup=BeautifulSoup(html,'html.parser')
22     lines=soup.find_all('dl',attrs={'class':'cmt-content'})#获得一整页所有的评论总的标签内容
23     for line in lines:#对每个评论进行解析,line就是每个评论的总标签内容<di class=cmt_content...>  ...</dl>
24         goal=line.find('strong',attrs={'class':'goal'}).string#得到总评分
25         comm_totall=line.find('div', attrs={'class':'eval-star'}).p.string.strip()#总评价
26         catagory=line.find('ul',attrs={'class':'goal-detail'}).find_all('li')#获得几个属性的评价
27        # print(catagory)
28         a1=catagory[0].string
29         a2 = catagory[1].string
30         a3 = catagory[2].string
31         a4 = catagory[3].string
32         a5 = catagory[4].string
33         comm_detail=line.find('p',attrs={'class':"text"})#具体评价,但这部分内容存在标签与字混合的成分,要把标签替换掉
34         detail_new=re.sub(r'<.*?>','',str(comm_detail))#因为部分内容存在空格xa0,要去掉这部分空格的代码显示
35         detail=','.join(detail_new.split())#用逗号来将分割的字符串两节起来,join()函数用来连接字符串数组元素
36         commentList.append([goal,comm_totall,a1,a2,a3,a4,a5,detail])
37     return commentList
38     # print(commentList)
39 
40 def comment(url,num):#获得多个页面的评论
41     data={'productId': 1073867,
42     'filterBy': -1,
43     'itemCfgId': -1,
44     'order': 2,
45     'pageNo': 1,
46     'vId': 432764}
47     comment_all=[]
48     for i in range(1,num+1):
49         data['pageNo']=i
50         html=getHtml(url,data)
51         comment=getComment(html)
52         comment_all+=comment
53         print('页数',i)
54     #print(comment_all)
55     return comment_all
56 
57 if __name__=='__main__':
58     url='http://pdcmt.pconline.com.cn/front/2015/mtp-list.jsp?'
59     a=comment(url,17)
60     print(len(a))
61     name = ['总评分', '总评价','性价比','屏幕','流畅度','电池','相机','细评']
62     test = pd.DataFrame(columns=name, data=a)
63     test.to_csv('D:/mi6x.csv', index=False)  # 去掉默认的行索引index

至于如何发起这样的网络请求,在网页上点击自然是使用了网站提供的JavaScript代码。而我们如果想要模拟这样一个操作,可以用不同语言的代码去实现。

我们以第一张COS照片的代码进行分析....额...第二张好看,还是从第二张开始吧。

Query String Parameters显示了我们请求的网页地址的参数部分,也就是我们网页的主体部分是' ' String Parameters.

我们可以使用浏览器自带的抓包工具,以Chrome浏览器为例,点击浏览器的检查按钮,找到Network,点击clear清楚掉之前的请求记录,如下图

这三条数据和其他Network条目是相同的,但是since不相同,和其他条目对比

bob体育平台 7

bob体育平台 8投硬币拦截的包

效果

bob体育平台 9

总结一下,我们就是在找动态网页的时候通过打开开发者选项(F12),找到要爬取网页文件的header,在Query String Parameters中找到对应的参数部分,最后将url主体部分和参数部分结合一起就能得到完整的url地址了。

有了这三个东西,我们就可以不用浏览器,直接使用其他的软件完成投币操作了。

bob体育平台 10

     关于Ajax的比较详细的解释推荐两个链接,比较详细的阐述了这是怎么回事,爬取Ajax动态加载和翻页时url不变的网页+网站案例,爬取Ajax动态加载和翻页时url不变的网页。自己说一下我遇到的问题,以及如何既解决的方法,我的问题比较简单就是翻页url地址不变,无法爬取下一页评论的内容。其实这是因为网站的网站隐藏住了url地址后面的参数部分,只显示了地址的主体部分,办法很简单就是找到这些网页url地址被隐藏的参数部分。下面讲一下我的解决步骤:

然后我们点击确定,浏览器会记录下刚才的网络请求,如下图

 

下面附一下爬取的代码:

bob体育平台 11加入购物车的请求内容

点击F12,可以看到开发者工具窗口

可以看见,Query String Parameters.对应是个字典,也可以通过键值对的形式改变字典pageNo的值,来达到访问不同评论网址的目的。下面就是爬取网站内容的工作了,这就是我找隐藏网址的过程。

bob体育平台 12投币结果

版权声明:本文由bob体育app发布于编程,转载请注明出处:爬取动态网页时遇上的难点