网页抓取qq(如何寻找异步文件以及抓取内容的坑网页的文件)
优采云 发布时间: 2021-12-24 12:00网页抓取qq(如何寻找异步文件以及抓取内容的坑网页的文件)
1.问题描述
最近由于学习内容的要求,需要从网页抓取一些数据做分析报告。看了一些python爬虫的基础知识,直接去网站爬取数据。作为新手,踩坑在所难免。最近遇到了一个比较难的问题:
一般情况下,我们需要抓取网页上某个标签上的内容,通过urllib下载网页内容后,通过BeautifulSoup对象解析网页内容,然后通过fina_all()方法找到我们想要的标签内容。
比如我想抓取QQ音乐类播放列表下的所有播放列表信息。分解任务后,应该是:
抓取当前页面的播放列表信息;翻页;判断是否是最后一页,如果不是最后一页,则返回步骤1,如果是最后一页,则结束爬虫程序。
首先,编写一个简单的代码来获取单个页面上所有播放列表的标题:
import urllib
from bs4 import BeautifulSoup
url = https://y.qq.com/portal/playlist.html
html = urllib.urlopen(url)
bsObj = BeautifulSoup(html)
playTitle_list = bsObj.find_all("span", {"class": "playlist__title_txt"}) # 抓取该页面歌单标题并保存在列表中
print(playTitle_list)
for playTitle in playTitle_list: # 输出所有标题
print(i.get_text())
可以通过右键单击网页并检查网页属性来找到标签参数。播放列表的标题信息可以通过属性类为playlist_title_txt的span标签找到,但是执行代码后,输出的结果只是一个空列表。是不是很奇怪?作为一个菜鸟,我真是绞尽脑汁想了半天也想不出原因。
然后和同学交流,听他讲了他之前看到的异步加载内容,发现我爬的网页的特征有点相似,于是去了解了一下。
一个流行的描述是,这个异步加载的网页显示的内容全部来自当前URL所代表的网页文件。部分内容是从当前网页文件中通过对另一个网页内容的函数调用来加载的,也就是说要获取的内容所属的网页文件确实与当前网页文件不是同一个文件当前网页文件,因此无法获取。因此,需要找到获取的内容真正所属的文件。
2.解决方案
接下来,我们将介绍如何查找异步加载的文件以及在爬取过程中可能遇到的坑。
1.网页右键选择**“检查”,在调试界面找到“网络”选项,然后一一找到js文件(记得刷新网页否则js文件不会被显示),通过预览**来查看内容是否是你要爬取的
2. 在各个js文件的具体信息面板中,可以通过预览查看传入的内容。我们找到了播放列表的标题信息的源文件,然后通过Headers属性可以找到该信息的真实源文件的链接,并使用url作为我们的requests参数。
Headers 属性下的通用和请求头收录了我们想要的信息。通用属性下的URL还包括值类型,这里是get。
所以我们可以通过请求模块获取播放列表信息。这里需要注意:网页的request headers值要传递给requests模块的get方法,否则无法获取网页
import requests
url = ...
headers ={...} # headers信息要以字典的形式保存
jsContent = requests.get(url).text
3. 一般情况下,上面的处理过程会得到一个json对象(看起来像字典的字符串表示)。可以直接使用python中的json模块将json对象转成python对象—字典,方便通过key获取数据
jsDict = json.loads(jsContent)
但有时获取的数据形式除了json对象外还会加上json对象名,比如:
playList({...}) # 其中{}表示json对象内容
这种情况下无法通过json模块转换数据类型,通常会出现异常
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
在这种异常情况下,可以通过字符串的切片截取json对象信息,然后通过json模块转换数据类型(这是我想出来的一个笨方法。如果有人知道更正式的方法,希望能指正。点击(っ•̀ω•́)っ✎⁾⁾)