Python爬虫之动态网页抓取(万科更新时间)

Python轻松实现动态网页爬虫(附详细源码)! AJAX动态加载网页 一 什么是动态网页 J哥一向注重理论与实践相结合,知其然也要知其所以然,才能以不变应万变。 所谓的动态网页,是指跟静态网页相对的一种网页编程技术。静态网页,随着html代码的生成,页面的内容和显示效果就基本上不会发生变化了——除非你修改页面代码。而动态网页则不然,页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的。——来源百度百科 动态网页具有减少工作量、内容更新快、可完成功能多等特点,被很... 阅读详情

一.前言

爬取的页面分为静态页面和动态页面,静态的页面爬取很常见,就如豆瓣top250的爬取,展示的内容都在HTML源代码中。而动态页面,很多内容不会出现在HTML源代码中,例如使用JavaScript时,很可能出现这种情况。
静态网页例子:
豆瓣Top250页面标题https://movie.douban.com/top250?start=25&filter=
F12—>检查(选择触不可及),可以看到源码定位到触不可及标题这里。
在这里插入图片描述
在右键打开源码
在这里插入图片描述
可以看到此源码中存在该标题内容,因此爬取豆瓣Top250时候,这是一个静态页面,可以直接使用该URL进行爬取(也就是说我们可以把该URL当作真实地址进行爬取)。
动态网页例子:
万科更新时间https://baike.baidu.com/historylist/%E4%B8%87%E7%A7%91/6141470#page1
在这里插入图片描述
可以看到在该页面仍然可以用检查工具找到对应的位置,这里我们都会犯一个错误,就是由此认为其是一个静态页面,但真正的判断是右键继续查看源码。
在这里插入图片描述
可以发现HTML后面有一段代码,翻到其他页数看源码,发现最后的那一段代码仍然是相同的。
因此我们得到结论,它是一个动态页面,并不是真正的数据存储的地址,因此,我们需要寻找其真实地址。那么对于动态页面的爬取采用如下两种技术。

二.动态页面爬取技术

1.解析真实地址抓取

1.F12—>Network
在这里插入图片描述
2.寻找xhr文件或者json文件
点击Type便于寻找(因为其会给你将Type分类)
在这里插入图片描述
发现下图的xhr文件的Name有点类似于我们爬取豆瓣时候的地址
在这里插入图片描述
点击该文件查看
在这里插入图片描述
发现一堆数据,有时间,id,姓名等属性,因此断定该文件的url为真实地址。
因此,我们可以进行爬取该地址
代码如下:

#coding:utf-8
import requests

url = "https://baike.baidu.com/api/wikiui/gethistorylist?tk=10273b583b2d59dc49cbcfc1eb5cf5a3&lemmaId=6141470&from=3&count=1&size=25"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36',
    'Host': 'baike.baidu.com',
    'Cookie': 'BIDUPSID=66D853C540ACF3CA684E9852E1DCF1DB; PSTM=1590825717; BAIDUID=66D853C540ACF3CAE0B26F235ABD45ED:FG=1; BK_SEARCHLOG=%7B%22key%22%3A%5B%22hex%22%2C%22%E8%B5%9E%E5%8A%A9%E4%BA%BA%22%2C%22%E8%B5%9E%E5%8A%A9%E5%98%89%E5%AE%BE%22%2C%22SAML%22%2C%22%E7%94%A8%E6%88%B7%22%2C%22Rainbow%E8%A1%A8%E6%94%BB%E5%87%BB%E7%BB%95%E8%BF%87%E6%9C%80%E5%A4%A7%E5%A4%B1%E8%B4%A5%E7%99%BB%E5%BD%95%E9%99%90%E5%88%B6%22%2C%22%E7%89%B9%E6%9D%83%E5%8D%87%E7%BA%A7%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%22%2C%22%E7%89%B9%E6%9D%83%E5%8D%87%E7%BA%A7%22%2C%22%E8%AE%A4%E5%8F%AF%22%2C%22%E5%90%8C%E8%B4%A8%E6%80%A7%22%5D%7D; H_WISE_SIDS=154770_153759_156158_155553_149355_156816_156287_150775_154259_148867_156096_154606_153243_153629_157262_157236_154172_156417_153065_156516_127969_154174_158527_150346_155803_146734_158745_131423_154037_107316_158054_158876_154189_155344_155255_157171_157790_144966_157401_154619_157814_158716_156726_157418_147551_157118_158367_158505_158589_157696_154639_154270_157472_110085_157006; BDUSS=klPNzU4NldvdkJOUG5DWk1zUWd0VUJPQjV4c3U2bHoxblBnS0NmcEtDT0hKR2hnRVFBQUFBJCQAAAAAAAAAAAEAAABOxNvnSnNrMjEyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIeXQGCHl0Bgf; BDUSS_BFESS=klPNzU4NldvdkJOUG5DWk1zUWd0VUJPQjV4c3U2bHoxblBnS0NmcEtDT0hKR2hnRVFBQUFBJCQAAAAAAAAAAAEAAABOxNvnSnNrMjEyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIeXQGCHl0Bgf; __yjs_duid=1_420ea1f33b6915a9547439f2725ac2811617111425851; Hm_lvt_55b574651fcae74b0a9f1cf9c8d7c93a=1617721790,1617721848,1617721949,1618794964; BAIDUID_BFESS=07052B6E9DBAC2EF4CB760778355D0A6:FG=1; __yjs_st=2_ZDc0Y2QxNzIyMmRmYzlmMjdjNjBmZmYzNGQ1MjcwN2IzMTU5Mzk5ODZmZGUxODJiYjQxMGU1NDQ2MGQwNjNmMmYzOTc1YmY4ZDcxZjgxYjNhYjI4M2I0ODU5ZTNmNGEyNGM4NDE0NTFmZDc3NjBjZGU0YWRmMTgwNmQxZjNhMzllNzE1MTYyZjNmYTMwNmNlNTZmMmEyNmI0MzJkMGY3MGI0Zjc3NGE0N2QxZDY2NjkxMjAwMmIyYzIyODg3NjkzNDQ3NWQ3ZjYyOWZiNTExMGEwZDRiOTVjNGZiNDg2NGU4ZDYzYmVmMzkxMTU3OTAyOGU5OWU3N2Q3YjRiMDk2N183Xzc0YjEzMTY3; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; BDRCVFR[VbLWpd7HGum]=mk3SLVN4HKm; H_PS_PSSID=33839_33822_31254_33849_33760_33607_26350_33893; ab_sr=1.0.0_Y2YwMDFlM2ZmMTMzODEzNmYxNzE5M2M0YTk0ZDQ1ZTM1YTZjMzE5OTVkMzFlM2M2YzcxOWI3ZDBmODNlOTU4YTA5NDY1YTUwNTYwMTI4OTMyYWZiM2VlNGE5MzhiZmI2NDNjZmRjMmE4YWE1NTFmZGZmMjg5NWIzMWI4OTM1ODE=',
}
r = requests.get(url,headers=headers)
print(r.status_code)
print(r.text)

在这里插入图片描述
可以看到成功爬取,但是得到的内容并不是我们想要的,我们需要把json解析该数据
代码如下:

#coding:utf-8
import requests
import json

url = "https://baike.baidu.com/api/wikiui/gethistorylist?tk=10273b583b2d59dc49cbcfc1eb5cf5a3&lemmaId=6141470&from=3&count=1&size=25"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36',
    'Host': 'baike.baidu.com',
    'Cookie': 'BIDUPSID=66D853C540ACF3CA684E9852E1DCF1DB; PSTM=1590825717; BAIDUID=66D853C540ACF3CAE0B26F235ABD45ED:FG=1; BK_SEARCHLOG=%7B%22key%22%3A%5B%22hex%22%2C%22%E8%B5%9E%E5%8A%A9%E4%BA%BA%22%2C%22%E8%B5%9E%E5%8A%A9%E5%98%89%E5%AE%BE%22%2C%22SAML%22%2C%22%E7%94%A8%E6%88%B7%22%2C%22Rainbow%E8%A1%A8%E6%94%BB%E5%87%BB%E7%BB%95%E8%BF%87%E6%9C%80%E5%A4%A7%E5%A4%B1%E8%B4%A5%E7%99%BB%E5%BD%95%E9%99%90%E5%88%B6%22%2C%22%E7%89%B9%E6%9D%83%E5%8D%87%E7%BA%A7%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%22%2C%22%E7%89%B9%E6%9D%83%E5%8D%87%E7%BA%A7%22%2C%22%E8%AE%A4%E5%8F%AF%22%2C%22%E5%90%8C%E8%B4%A8%E6%80%A7%22%5D%7D; H_WISE_SIDS=154770_153759_156158_155553_149355_156816_156287_150775_154259_148867_156096_154606_153243_153629_157262_157236_154172_156417_153065_156516_127969_154174_158527_150346_155803_146734_158745_131423_154037_107316_158054_158876_154189_155344_155255_157171_157790_144966_157401_154619_157814_158716_156726_157418_147551_157118_158367_158505_158589_157696_154639_154270_157472_110085_157006; BDUSS=klPNzU4NldvdkJOUG5DWk1zUWd0VUJPQjV4c3U2bHoxblBnS0NmcEtDT0hKR2hnRVFBQUFBJCQAAAAAAAAAAAEAAABOxNvnSnNrMjEyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIeXQGCHl0Bgf; BDUSS_BFESS=klPNzU4NldvdkJOUG5DWk1zUWd0VUJPQjV4c3U2bHoxblBnS0NmcEtDT0hKR2hnRVFBQUFBJCQAAAAAAAAAAAEAAABOxNvnSnNrMjEyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIeXQGCHl0Bgf; __yjs_duid=1_420ea1f33b6915a9547439f2725ac2811617111425851; Hm_lvt_55b574651fcae74b0a9f1cf9c8d7c93a=1617721790,1617721848,1617721949,1618794964; BAIDUID_BFESS=07052B6E9DBAC2EF4CB760778355D0A6:FG=1; __yjs_st=2_ZDc0Y2QxNzIyMmRmYzlmMjdjNjBmZmYzNGQ1MjcwN2IzMTU5Mzk5ODZmZGUxODJiYjQxMGU1NDQ2MGQwNjNmMmYzOTc1YmY4ZDcxZjgxYjNhYjI4M2I0ODU5ZTNmNGEyNGM4NDE0NTFmZDc3NjBjZGU0YWRmMTgwNmQxZjNhMzllNzE1MTYyZjNmYTMwNmNlNTZmMmEyNmI0MzJkMGY3MGI0Zjc3NGE0N2QxZDY2NjkxMjAwMmIyYzIyODg3NjkzNDQ3NWQ3ZjYyOWZiNTExMGEwZDRiOTVjNGZiNDg2NGU4ZDYzYmVmMzkxMTU3OTAyOGU5OWU3N2Q3YjRiMDk2N183Xzc0YjEzMTY3; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; BDRCVFR[VbLWpd7HGum]=mk3SLVN4HKm; H_PS_PSSID=33839_33822_31254_33849_33760_33607_26350_33893; ab_sr=1.0.0_Y2YwMDFlM2ZmMTMzODEzNmYxNzE5M2M0YTk0ZDQ1ZTM1YTZjMzE5OTVkMzFlM2M2YzcxOWI3ZDBmODNlOTU4YTA5NDY1YTUwNTYwMTI4OTMyYWZiM2VlNGE5MzhiZmI2NDNjZmRjMmE4YWE1NTFmZGZmMjg5NWIzMWI4OTM1ODE=',
}
r = requests.get(url,headers=headers)
print(r.status_code)
print(r.text)
json_data = json.loads(r.text)
print(json_data)
comment_list = json_data['data']
print(comment_list)

在这里插入图片描述
可以看到json解析后的结果,也可以看到查询json解析后的data下的数据,因此可以从输出结果可以找到规律,我们要找更新时间,该元素在r.text的字典中的data字典中的pages字典下的3字典下的数组中,数组下的字典auditTime中
代码如下:

#coding:utf-8
import requests
import json

url = "https://baike.baidu.com/api/wikiui/gethistorylist?tk=10273b583b2d59dc49cbcfc1eb5cf5a3&lemmaId=6141470&from=3&count=1&size=25"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36',
    'Host': 'baike.baidu.com',
    'Cookie': 'BIDUPSID=66D853C540ACF3CA684E9852E1DCF1DB; PSTM=1590825717; BAIDUID=66D853C540ACF3CAE0B26F235ABD45ED:FG=1; BK_SEARCHLOG=%7B%22key%22%3A%5B%22hex%22%2C%22%E8%B5%9E%E5%8A%A9%E4%BA%BA%22%2C%22%E8%B5%9E%E5%8A%A9%E5%98%89%E5%AE%BE%22%2C%22SAML%22%2C%22%E7%94%A8%E6%88%B7%22%2C%22Rainbow%E8%A1%A8%E6%94%BB%E5%87%BB%E7%BB%95%E8%BF%87%E6%9C%80%E5%A4%A7%E5%A4%B1%E8%B4%A5%E7%99%BB%E5%BD%95%E9%99%90%E5%88%B6%22%2C%22%E7%89%B9%E6%9D%83%E5%8D%87%E7%BA%A7%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%22%2C%22%E7%89%B9%E6%9D%83%E5%8D%87%E7%BA%A7%22%2C%22%E8%AE%A4%E5%8F%AF%22%2C%22%E5%90%8C%E8%B4%A8%E6%80%A7%22%5D%7D; H_WISE_SIDS=154770_153759_156158_155553_149355_156816_156287_150775_154259_148867_156096_154606_153243_153629_157262_157236_154172_156417_153065_156516_127969_154174_158527_150346_155803_146734_158745_131423_154037_107316_158054_158876_154189_155344_155255_157171_157790_144966_157401_154619_157814_158716_156726_157418_147551_157118_158367_158505_158589_157696_154639_154270_157472_110085_157006; BDUSS=klPNzU4NldvdkJOUG5DWk1zUWd0VUJPQjV4c3U2bHoxblBnS0NmcEtDT0hKR2hnRVFBQUFBJCQAAAAAAAAAAAEAAABOxNvnSnNrMjEyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIeXQGCHl0Bgf; BDUSS_BFESS=klPNzU4NldvdkJOUG5DWk1zUWd0VUJPQjV4c3U2bHoxblBnS0NmcEtDT0hKR2hnRVFBQUFBJCQAAAAAAAAAAAEAAABOxNvnSnNrMjEyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIeXQGCHl0Bgf; __yjs_duid=1_420ea1f33b6915a9547439f2725ac2811617111425851; Hm_lvt_55b574651fcae74b0a9f1cf9c8d7c93a=1617721790,1617721848,1617721949,1618794964; BAIDUID_BFESS=07052B6E9DBAC2EF4CB760778355D0A6:FG=1; __yjs_st=2_ZDc0Y2QxNzIyMmRmYzlmMjdjNjBmZmYzNGQ1MjcwN2IzMTU5Mzk5ODZmZGUxODJiYjQxMGU1NDQ2MGQwNjNmMmYzOTc1YmY4ZDcxZjgxYjNhYjI4M2I0ODU5ZTNmNGEyNGM4NDE0NTFmZDc3NjBjZGU0YWRmMTgwNmQxZjNhMzllNzE1MTYyZjNmYTMwNmNlNTZmMmEyNmI0MzJkMGY3MGI0Zjc3NGE0N2QxZDY2NjkxMjAwMmIyYzIyODg3NjkzNDQ3NWQ3ZjYyOWZiNTExMGEwZDRiOTVjNGZiNDg2NGU4ZDYzYmVmMzkxMTU3OTAyOGU5OWU3N2Q3YjRiMDk2N183Xzc0YjEzMTY3; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; BDRCVFR[VbLWpd7HGum]=mk3SLVN4HKm; H_PS_PSSID=33839_33822_31254_33849_33760_33607_26350_33893; ab_sr=1.0.0_Y2YwMDFlM2ZmMTMzODEzNmYxNzE5M2M0YTk0ZDQ1ZTM1YTZjMzE5OTVkMzFlM2M2YzcxOWI3ZDBmODNlOTU4YTA5NDY1YTUwNTYwMTI4OTMyYWZiM2VlNGE5MzhiZmI2NDNjZmRjMmE4YWE1NTFmZGZmMjg5NWIzMWI4OTM1ODE=',
}
r = requests.get(url,headers=headers)
print(r.status_code)
print(r.text)
json_data = json.loads(r.text)
print(json_data)
comment_list = json_data['data']
print(comment_list)
comment_list = json_data['data']['pages']['3']

for eachone in comment_list:
    time1 = eachone['auditTime']
    print(time1)

在这里插入图片描述
可以看到成功得到时间戳,但还不是我们想要的结果,我们将它改成北京时间
代码如下:

#coding:utf-8
import requests
import json
import time

url = "https://baike.baidu.com/api/wikiui/gethistorylist?tk=10273b583b2d59dc49cbcfc1eb5cf5a3&lemmaId=6141470&from=3&count=1&size=25"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36',
    'Host': 'baike.baidu.com',
    'Cookie': 'BIDUPSID=66D853C540ACF3CA684E9852E1DCF1DB; PSTM=1590825717; BAIDUID=66D853C540ACF3CAE0B26F235ABD45ED:FG=1; BK_SEARCHLOG=%7B%22key%22%3A%5B%22hex%22%2C%22%E8%B5%9E%E5%8A%A9%E4%BA%BA%22%2C%22%E8%B5%9E%E5%8A%A9%E5%98%89%E5%AE%BE%22%2C%22SAML%22%2C%22%E7%94%A8%E6%88%B7%22%2C%22Rainbow%E8%A1%A8%E6%94%BB%E5%87%BB%E7%BB%95%E8%BF%87%E6%9C%80%E5%A4%A7%E5%A4%B1%E8%B4%A5%E7%99%BB%E5%BD%95%E9%99%90%E5%88%B6%22%2C%22%E7%89%B9%E6%9D%83%E5%8D%87%E7%BA%A7%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%22%2C%22%E7%89%B9%E6%9D%83%E5%8D%87%E7%BA%A7%22%2C%22%E8%AE%A4%E5%8F%AF%22%2C%22%E5%90%8C%E8%B4%A8%E6%80%A7%22%5D%7D; H_WISE_SIDS=154770_153759_156158_155553_149355_156816_156287_150775_154259_148867_156096_154606_153243_153629_157262_157236_154172_156417_153065_156516_127969_154174_158527_150346_155803_146734_158745_131423_154037_107316_158054_158876_154189_155344_155255_157171_157790_144966_157401_154619_157814_158716_156726_157418_147551_157118_158367_158505_158589_157696_154639_154270_157472_110085_157006; BDUSS=klPNzU4NldvdkJOUG5DWk1zUWd0VUJPQjV4c3U2bHoxblBnS0NmcEtDT0hKR2hnRVFBQUFBJCQAAAAAAAAAAAEAAABOxNvnSnNrMjEyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIeXQGCHl0Bgf; BDUSS_BFESS=klPNzU4NldvdkJOUG5DWk1zUWd0VUJPQjV4c3U2bHoxblBnS0NmcEtDT0hKR2hnRVFBQUFBJCQAAAAAAAAAAAEAAABOxNvnSnNrMjEyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIeXQGCHl0Bgf; __yjs_duid=1_420ea1f33b6915a9547439f2725ac2811617111425851; Hm_lvt_55b574651fcae74b0a9f1cf9c8d7c93a=1617721790,1617721848,1617721949,1618794964; BAIDUID_BFESS=07052B6E9DBAC2EF4CB760778355D0A6:FG=1; __yjs_st=2_ZDc0Y2QxNzIyMmRmYzlmMjdjNjBmZmYzNGQ1MjcwN2IzMTU5Mzk5ODZmZGUxODJiYjQxMGU1NDQ2MGQwNjNmMmYzOTc1YmY4ZDcxZjgxYjNhYjI4M2I0ODU5ZTNmNGEyNGM4NDE0NTFmZDc3NjBjZGU0YWRmMTgwNmQxZjNhMzllNzE1MTYyZjNmYTMwNmNlNTZmMmEyNmI0MzJkMGY3MGI0Zjc3NGE0N2QxZDY2NjkxMjAwMmIyYzIyODg3NjkzNDQ3NWQ3ZjYyOWZiNTExMGEwZDRiOTVjNGZiNDg2NGU4ZDYzYmVmMzkxMTU3OTAyOGU5OWU3N2Q3YjRiMDk2N183Xzc0YjEzMTY3; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; BDRCVFR[VbLWpd7HGum]=mk3SLVN4HKm; H_PS_PSSID=33839_33822_31254_33849_33760_33607_26350_33893; ab_sr=1.0.0_Y2YwMDFlM2ZmMTMzODEzNmYxNzE5M2M0YTk0ZDQ1ZTM1YTZjMzE5OTVkMzFlM2M2YzcxOWI3ZDBmODNlOTU4YTA5NDY1YTUwNTYwMTI4OTMyYWZiM2VlNGE5MzhiZmI2NDNjZmRjMmE4YWE1NTFmZGZmMjg5NWIzMWI4OTM1ODE=',
}
r = requests.get(url,headers=headers)
print(r.status_code)
print(r.text)
json_data = json.loads(r.text)
print(json_data)
comment_list = json_data['data']
print(comment_list)
comment_list = json_data['data']['pages']['3']

for eachone in comment_list:
    time1 = eachone['auditTime']
    print(time1)
    time_tuple = time.localtime(time1)
    bj_time = time.strftime("%Y/%m/%d %H:%M:%S",time_tuple)
print("北京时间:",bj_time)

在这里插入图片描述
可以看到成功显示北京时间,达到我们的目的
在这里插入图片描述
验证成功

2.Selenium模拟浏览器抓取

此方法即用浏览器渲染引擎,直接用浏览器在显示的网页时解析HTML,应用CSS样式并执行Javascript的语句。这个方法在爬虫过程中会打开一个浏览器加载该页面,自动操作浏览器浏览各个网页,顺便把数据抓下来,用一句简单而通俗的话说,就是使用浏览器渲染方法将爬取动态网页变成爬取静态网页。
Selenium是Python中的一个库,其可以实现多个浏览器的调用,这里使用火狐
代码如下:

from selenium import webdriver
driver = webdriver.Firefox()
driver.get('https://www.baidu.com/')

在这里插入图片描述
发现程序有报错,这是因为最新版本的selenium无法正常运行。
解决办法:
1.下载geckodriver.exe,下载地址:https://github.com/mozilla/geckodriver/releases,下载后解压
2.然后将解压后的geckodriver.exe放在Firefox的安装目录下,如:C:\Program Files\Mozilla Firefox,并在环境变量Path中添加路径:C:\Program Files\Mozilla Firefox。
然后我们重启电脑再次运行,结果如下:
在这里插入图片描述
在这里插入图片描述
同时打开了火狐,但是效果很失望,没有显示百度,这是因为没有设置执行路径
解决方法:把webdriver.Firefox()改成webdriver.Firefox(executable_path=r’geckodriver.exe的地址’)
代码如下:

from selenium import webdriver
browser = webdriver.Firefox(executable_path=r'C:\Program Files\Mozilla Firefox\geckodriver.exe')
browser.get("https://www.baidu.com/")

在这里插入图片描述

可以看到成功返回我们所需要访问的百度。到这里我们的selenium就已经配置好了。
因此我们继续爬取万科更新时间
使用该方法打开万科页面:(只需把browser.get(改成万科url))
在这里插入图片描述
继续F12,使用检查找到该元素
在这里插入图片描述
可以看到该时间元素,根据上图可看出时间元素都在<tbody>标签内,同时又各自在一个submitTime的class类下。因此这里运用WebDriver查找网页元素的方法。
扩展内容:

#以下都是单次定位,返回第一个定位到的。如果想多次定位,给element加个s就行,返回的是符合元素的列表
element = driver.find_element_by_id() # 通过标签的id定位,接收id属性值

driver.find_element_by_name() # 通过标签的name定位,接收name属性值

driver.find_element_by_xpath() # 通过xpath定位,接收xpath表达式

driver.find_element_by_link_text() # 通过标签的完全文本定位,接收完整的文本

driver.find_element_by_partial_link_text() # 通过标签的部分文本定位,接收部分文本

driver.find_element_by_tag_name() # 通过标签名定位,接收标签名

driver.find_element_by_class_name() # 通过标签的class定位,接收class属性值

driver.find_element_by_css_selector() # 通过css选择器定位,接收其语法
#返回的WebElement对象可以继续往下定位

代码如下:

from selenium import webdriver
browser = webdriver.Firefox(executable_path=r'C:\Program Files\Mozilla Firefox\geckodriver.exe')
browser.get("https://baike.baidu.com/historylist/%E4%B8%87%E7%A7%91/6141470#page1")
comment = browser.find_element_by_tag_name('tbody')
print(comment.text)

在这里插入图片描述
可以看到成功得到<tbody>下的内容
接下来,我们获得名为submitTime的class里的内容(也就是我们要的内容)
代码如下:

from selenium import webdriver
browser = webdriver.Firefox(executable_path=r'C:\Program Files\Mozilla Firefox\geckodriver.exe')
browser.get("https://baike.baidu.com/historylist/%E4%B8%87%E7%A7%91/6141470#page1")
comment = browser.find_element_by_tag_name('tbody')
conent = comment.find_element_by_class_name('submitTime')
print(conent.text)

在这里插入图片描述
发现,这里只返回了第一个更新时间,也就正如上面扩展内容一样,只是返回第一个,我们需要将element改成elements才可以返回所有的查找结果
代码如下:

from selenium import webdriver
browser = webdriver.Firefox(executable_path=r'C:\Program Files\Mozilla Firefox\geckodriver.exe')
browser.get("https://baike.baidu.com/historylist/%E4%B8%87%E7%A7%91/6141470#page1")
comment = browser.find_element_by_tag_name('tbody')
conent = comment.find_elements_by_class_name('submitTime')
for each_list in conent:
	print(each_list.text)

在这里插入图片描述
成功获得更新时间,这里需要注意的是我们将element改成elements时,其返回的是list类型,那么我们需要利用循环将其打印
在这里插入图片描述
验证成功,完结

网络爬虫爬取动态网页数据 对于动态网页的数据可以直接使用模拟浏览器运行的方式进行实现,这样做就可以不用管网页内部是如何使用JavaScript渲染页面的,也不用管Ajax请求中到底有没有加密参数,在浏览器中看到是什么样的内容,抓取的结果便是什么样的内容。,Selenium的Alert类中提供了text属性、 accept()方法、 dismiss)方法和send_keys()方法,前三个属性或方法的作用与确认框中的作用相同, send_keys()方法用于接收用户输入的内容。WebDriver类中定位单个元素的方法如下所示。 阅读详情

相关推荐

网络爬虫中抓捕动态网页数据的实战指南

本文为你详细介绍了抓捕动态网页数据的方法和步骤,希望能帮助你在数据获取的道路上更进一步。动态网页并不是一次性加载完成的,它们会根据用户的操作、时间或其他因素动态地展示内容。最常见的是通过AJAX技术实现的,数据在后台异步加载,而页面本身并不刷新。传统的网络爬虫通常只抓取HTML页面,但动态内容可能隐藏在JavaScript中,这使得使用传统的requests库很难获取。response.html.render() # 这会触发页面上的JavaScript渲染,就像一个真实的浏览器那样。

2301_78160397的博客 3034

Python动态网页爬取

一、动态网页概述随着互联网技术的发展,动态网页逐渐成为了互联网上最为流行的网页类型之一。相比于静态网页,动态网页具有更加丰富和交互性的内容,可以根据用户的需求和交互行为实时生成和更新内容,大大提高了用户的使用体验和网站的互动性。动态网页通常采用动态HTML(Dynamic HTML)技术,通过JavaScript、AJAX等技术实现网页的动态效果和交互功能。动态网页通常包括两种类型。

Kali与编程 5430

绕过HTML解析:用API直取网页表格数据的实战方法

网页表格本质上是前端框架渲染的结果,其真实数据往往以JSON格式通过API接口传输。理解客户端渲染(CSR)与服务端渲染(SSR)的区别,掌握浏览器Network面板中识别XHR/Fetch请求的核心能力,是高效获取结构化数据的基础原理。该方法规避了HTML解析的嵌套歧义、CSS隐藏干扰和JavaScript动态加载难题,显著提升准确率与执行效率。技术价值体现在轻量、稳定、可扩展——无需Selenium等重量级工具,仅靠requests+json即可支撑分页、筛选、实时更新等复杂交互场景。广泛适用于金融行情

weixin_34315485的博客 429

Python爬取动态网站实战

在之前的推文中,我们介绍了如何爬取一个简单的静态网站——「[Python爬取静态网站」,但是在实际过程中,常常会遇到需要爬取动态网站数据的情况。在本文中,我们也将通过一个比较简单的案例,来介绍爬取动态网站数据的基本思路和步骤。

白帽阿叁的博客 1万+

大模型应用对比:豆包、腾讯元宝与DeepSeek实战能力解析

大模型应用并非简单比拼参数大小,而是模型能力、推理引擎与产品设计三者协同的结果。理解LLM应用的本质,需从基础概念出发:大语言模型(LLM)通过概率建模生成文本,其实际效果高度依赖工程化落地——包括模型选型(如DeepSeek的代码强项、腾讯混元的多模态优势、豆包的分层模型矩阵)、推理优化(流式响应、预测缓存、约束编译器)以及场景化交互设计。技术价值体现在降低用户决策成本、提升服务闭环效率与增强专业任务可验证性;典型应用场景覆盖生活查询、学术精读、创意文案、逻辑推理及长文档分析。本文基于5类真实任务实测,揭

weixin_30856725的博客 388

Python爬取动态网页技术解析

动态网页中数据需要通过逆向分析的思路,借助浏览器中的开发者模式,定位目标数据所在的资源,并确定目标数据所在的URL。

sinat_30844883的博客 3178

爬虫之动态页面爬取

动态页面爬取   好久没有写爬虫了,今天敲了一份爬虫出来——爬取百度百科的历史记录,结果在时隔四个月之后再次遇到的对手居然是一个动态页面(一开始把百度想的太简单了),不过在一番努力之后还是达到了我的目标,然后就当复习似的写了篇博客。 一、概念   动态页面其实是相对于静态页面而言的。在面对静态页面的时候直接查看response一般就是网页的全部代码了,但是动态页面不然,一般动态页面的response再打开的时候和你在网页看的不一样了。 二、实践及实践之前   因为本人超喜欢实践,所以二话不说进行上实践,

fishineye的专栏 1546

安居客租房数据采集清洗与可视化实战指南

租房数据分析是城市计算与居住研究的基础技术场景,其核心在于从非结构化网页中提取结构化数据,并完成地理编码、类型归一与异常过滤等关键清洗步骤。Playwright可模拟真实浏览器行为,有效应对安居客等平台的反爬机制;Pandas配合正则与业务规则实现价格单位统一、地铁距离解析、房源类型识别;高德API支持将‘步行5分钟’等自然语言描述转化为可用于空间分析的经纬度坐标。该流程不仅支撑热力图、箱线图、散点回归等可视化表达,更适用于高校课程设计、城市通勤研究及租赁市场监测等实际工程场景,强调数据可追溯、逻辑可复现、

weixin_30096975的博客 148

CnOpenData 线上招聘网站信息数据

CnOpenData线上招聘网站信息数据库是一个覆盖中国主流招聘平台、时间跨度长、更新频率高的劳动力市场需求侧大数据集合。本数据库汇集了,为学术界和业界提供了一扇实时观察中国劳动力市场动态的窗口。

CnOpenData_wj的博客 2501

手把手教你用RSoft BPM仿真一个1x2光分束器:从参数设置到结果分析全记录

本文详细介绍了使用RSoft BPM模块设计和仿真1×2光分束器的完整流程,包括参数设置、结构建模、仿真配置和结果分析。通过实战指南,帮助读者掌握光波导器件的仿真技术,实现50:50功率分配的设计目标,适用于光通信和集成光学领域的研究与应用。

weixin_30545945的博客 540

Redis【实战篇】---- 分布式锁-redission

重入问题:重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,比如HashTable这样的代码中,他的方法都是使用synchronized修饰的,假如他在一个方法内,调用另一个方法,那么此时如果是不可重入的,不就死锁了吗?所以可重入锁他的主要意义是防止死锁,我们的synchronized和Lock锁都是可重入的。不可重试:是指目前的分布式只能尝试一次,我们认为合理的情况是:当线程在获得锁失败后,他应该能再次尝试获得锁。

是微风,是晚霞,是无可替代 1万+

Python爬虫自学笔记(三)动态网页爬取

现在很多网站用的是动态网页加载技术,这时候用前面的request库和BS4库就不能解决问题了,需要用新的办法。 打开网页,按F12或者右键弹出菜单里选择“检查”,右侧会打开开发者工具。 这里有一排菜单,最左边的是Element,显示的是网页的源代码,如果在这里能直接找到所需要爬取的内容,就说明这是静态页面,可以用 request库和BeautifulSoup4库的工具爬取所需内容。如果这里找不到所需内容,那么就是动态页面。这时候往右面看Network菜单。 Network的功能是:记录在当前页面上

qq_41597915的博客 1万+

Kubernetes+EdgeX:构建企业级AI边缘推理平台

设备:工业摄像头(RTSP协议,输出1920x1080视频流);AI模型:YOLOv8训练的轴承裂纹检测模型(识别“裂纹”“正常”两种类型);目标:摄像头采集图像→EdgeX传输数据→K8s推理服务检测→结果反馈到报警器(HTTP协议)。Kubernetes+EdgeX的组合,为企业构建AI边缘推理平台提供了标准化、可扩展标准化:K8s的容器编排和EdgeX的设备管理,都是行业标准,避免“重复造轮子”;可扩展:支持从单边缘节点到 thousands of nodes 的规模,满足企业的增长需求;

AI算力网络与通信的博客 1340

如何使用 Python 爬虫抓取动态网页数据

本文介绍了如何使用 Python 爬虫抓取动态网页数据,包括分析动态网页、模拟用户行为、使用 Selenium 等技术。通过本文的介绍,读者可以了解到如何使用 Python 爬虫来获取动态网页中的数据,并可以在实际应用中灵活运用这些技术。

我滴小博客 7038

高通ISP模块全解析:从Raw到JPEG的18个关键处理步骤(附避坑指南)

本文全面解析高通ISP模块从Raw到JPEG的18个关键处理步骤,涵盖原始数据预处理、色彩科学处理链、画质增强与降噪等核心环节。通过实战调优经验,揭示ISP架构中的技术原理与工程实践要点,帮助开发者避免常见问题,提升移动影像处理质量。

weixin_30399155的博客 347

从高德、百度地图下载POI数据?用这个工具5分钟搞定GCJ02/BD09到WGS84的坐标纠偏

本文详细解析了高德、百度地图POI数据坐标偏移问题,并提供了从GCJ02/BD09到WGS84的高效转换方案。通过开源工具如coordtransform和ArcGIS等专业软件,实现毫米级精度的坐标纠偏,适用于商业选址、GIS分析等场景,显著提升数据准确性和工作效率。

weixin_26789847的博客 440

动态网页内容的爬取

文章目录问题解决过程1.查找json请求2.分析发布时间和标题3.分析正文页的json请求4.获取正文数据答案相关问题补充 # 动态网页 当用户请求的是一个动态网页时,服务器要做更多的工作才能把用户请求的信息发送回去,服务器一般按照以下步骤进行工作: 1、服务器端接受请求。 2、Web服务器从服务器硬盘指定的位置或内存中读取动态网页文件。 3、执行网页文件的程序代码,将含有程序代码的动态网页转化为标准的静态页面(如HTML)。 3、Web服务器将生成的静态页面代码发送给请求浏览器。 动态网页对应的网页实

m0_46312299的博客 6141

用Python爬取大连商品交易所期货实时行情:从入门到实战

python复制编辑# utils.py"豆粕": "M0","铁矿石": "I0","聚乙烯": "L0","玉米": "C0","聚丙烯": "PP0","棕榈油": "P0"本项目展示了:✅ 如何从新浪财经 API获取主力合约实时数据✅ 使用Python异步爬虫技术) 提升效率✅ 利用pandas和matplotlib进行结构化分析与可视化✅ 具备良好的扩展性,可对接金融、农业、能源等数据需求场景✅ 可作为期货量化策略数据源✅ 可嵌入自动化报告系统。

2201_76125261的博客 1241

Python爬虫:动态获取页面

​ 您可以在互联网上找到许多文章来帮助您抓取动态网站。这篇文章是我抓取Doordash.com 的方法。一切都是逐步进行的。 ​

探索人工智能领域 2041

【agent实战教程】OpenClaw多个agent一文通

一个合格的独立agent,必须具备6个完全独立的专属组件独立组件路径规则核心要求不独立的严重后果唯一agentId配置文件中全局唯一,不能重复,建议用英文+数字,不要有特殊字符agent配置冲突,消息派单错误,会话串线独立工作区(workspace)建议每个agent一个独立文件夹,不要共用人设、记忆、规则混在一起,agent人设崩塌,对话串线独立状态目录(agentDir)固定系统自动生成,绝对禁止多个agent复用同一个agentDir。

海兰 638

【Halcon-2D测量】add_metrology_object_rectangle2_measure 函数功能(用于向2D计量模型中添加旋转矩形(rectangle2类型)计量对象)

HALCON算子add_metrology_object_rectangle2_measure解析摘要 该算子是HALCON 2D计量模块的核心算子,用于添加旋转矩形计量对象并配置测量参数。主要功能包括:定义旋转矩形几何轮廓(中心坐标、主轴角度、长短半长);生成垂直于矩形边界的测量区域;设置边缘提取预处理参数(高斯平滑、振幅阈值)。关键注意事项:MeasureLength1必须小于矩形长短半长;角度参数Phi需使用弧度单位;多线程需同步模型句柄。该算子适用于方形螺母、PCB板边框等矩形零件的精密测量,需与a

weixin_45590420的博客 1219

Python实战——轻松实现动态网页爬虫(附详细源码)

【点击这里】

2301_78217634的博客 6151

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Python项目——轻松实现动态网页爬虫|附详细源码

动态网页爬虫是专门设计用来爬取动态网页内容的自动化程序或工具。与静态网页爬虫不同,动态网页的内容不是预先存储在服务器上的HTML文件,而是根据用户的请求、交互、时间、数据库状态或其他外部因素动态生成的。这些动态内容通常通过JavaScript、AJAX(Asynchronous JavaScript and XML)或其他客户端脚本技术在浏览器中异步加载。

2301_78096295的博客 2452

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

python爬虫实战 scrapy+selenium爬取动态网页

使用scrapy对接selenium完成对动态网站的爬取

栀子枝头盛的博客 7397

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Python爬虫基础(三):使用Selenium动态加载网页

(1)Selenium是一个用于Web应用程序测试的工具。(2)Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。(3)支持通过各种driver(FirfoxDriver,IternetExplorerDriver,OperaDriver,ChromeDriver)驱动真实浏览器完成测试。(4)selenium也是支持无界面浏览器操作的。模拟浏览器功能,自动执行网页中的js代码,实现动态加载(1)是一个无界面的浏览器(2)支持页面元素查找,js的执行等。

秃了也弱了 4134
上一篇: Chrome浏览器远程代码执行漏洞(无沙箱模式)
下一篇: Selenium WebDriver定位元素
qieziwa(boy)
博客等级 码龄7年 5704粉丝 160原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值