python网络爬虫-动态网页抓取(五)

动态抓取的实例

在开始爬虫之前,我们需要了解一下Ajax(异步请求)。它的价值在于在与后台进行少量的数据交换就可以使网页实现异步更新。
如果使用Ajax加载的动态网页抓取,有两种方法:

  1. 通过浏览器审查元素解析地址。
  2. 通过Selenium模拟浏览器抓取。

解析真实地址抓取

# 请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10、.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
}
for e in range(1, 11):
    # 要请求的数据地址
    link = """
        https://api-zero.livere.com/v1/comments/list?callback=jQuery112400364209957301318_1640670329077&limit=10&offset=""" + str(
        e) + """&repSeq=4272904&requestPath=%2Fv1%2Fcomments%2Flist&consumerSeq=1020&livereSeq=28583&smartloginSeq=5154&code=&_=1640670329079
        """
    # 加入请求头,发送请求
    r = requests.get(link, headers=headers)
    # 请求响应的内容
    json_string = r.text
    # 找到响应内容中的字符格式JSON数据
    json_string = json_string[json_string.find('{'):-2]
    # 把字符格式的响应数据转化为json数据
    json_data = json.loads(json_string)
    comment_list = json_data['results']['parents']
    i = 0
    for eachone in comment_list:
        message = eachone['content']
        i += 1
        print(i)
        print(message)

通过selenium模拟浏览器抓取:使用浏览器渲染的方式将爬取的动态网页变成静态网页

selenium安装

pip install selenium

fp = webdriver.FirefoxOptions()
fp.set_preference("permissions.default.stylesheet", 2)
# 打开浏览器
# driver = webdriver.Firefox(firefox_profile=fp, executable_path=r'C:\Program Files\Mozilla Firefox\firefox.exe')
driver = webdriver.Firefox(options=fp)
# 输入打开网址
driver.get("http://www.santostang.com/2018/07/04/hello-world/")
需要下载一个浏览器驱动器
下载chromedriver地址:http://chromedriver.storage.googleapis.com/index.html
下载geckodriver地址:https://github.com/mozilla/geckodriver/releases

selenium获取文章的所有评论

from selenium import webdriver  # 模拟浏览器抓取
fp = webdriver.FirefoxOptions()
fp = webdriver.ChromeOptions()
# fp.set_preference("permissions.default.stylesheet", 2)
fp.set_capability("permissions.default.stylesheet", 2)
# 打开浏览器
# driver = webdriver.Firefox(firefox_profile=fp, executable_path=r'C:\Program Files\Mozilla Firefox\firefox.exe')
# driver = webdriver.Firefox(options=fp)
driver = webdriver.Chrome(options=fp)
# 输入打开网址
driver.get("http://www.santostang.com/2018/07/04/hello-world/")
# # 切换到ifrom
# driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livere-comment']"))
# # 通过class选择器的方式查找
# comment = driver.find_element_by_css_selector('div.reply-content')
# # 通过标签选择器查找
# content = comment.find_element_by_tag_name('p')
# selenium选择元素的方法
# find_element_by_id:通过元素的id选择,例如:driver.find_element_by_id(‘loginForm’)
# find_element_by_name:通过元素的name选择,driver.find_element_by_name(‘password’)
# find_element_by_xpath:通过xpath选择,driver.find_element_by_xpath(“ // form[1]”)
# find_element_by_link_text:通过链接地址选择
# find_element_by_partial_link_text:通过链接的部分地址选择
# find_element_by_tag_name:通过元素的名称选择
# find_element_by_class_name:通过元素的class选择
# find_element_by_css_selector:通过css选择器选择
# 需要查找多个元素,就是在上述的element后加上s,变成elements。xpath和css_selector是比较好的方法
# 常见的操作元素方法
# clear 清除元素的内容
# – send_keys 模拟按键输入
# – click 点击元素
# – submit 提交表单

# 执行JS脚本    滑倒底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livere-comment']"))
time.sleep(1)
for i in range(0, 3):
    load_more = driver.find_element_by_css_selector('button.page-last-btn')
    load_more.click()
    # driver.switch_to.default_content()
    time.sleep(1)
    # driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livere-comment']"))
    comments = driver.find_elements_by_css_selector('div.reply-content')
    for cm in comments:
        content = cm.find_element_by_tag_name('p')
        print(content.text)

selenium优化操作

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
import random

options = Options()
num = str(float(random.randint(500, 600)))
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/{}"
                     " (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/{}".format(num, num))
# 禁止图片和css加载
prefs = {"profile.managed_default_content_settings.images": 2, 'permissions.default.stylesheet': 2}
options.add_experimental_option("prefs", prefs)

driver = webdriver.Chrome(executable_path='E:\\DownLoad\\python\\Scripts\\chromedriver.exe', chrome_options=options)
driver.get('https://www.ly.com/')
time.sleep(5)
html = driver.find_element_by_xpath("//body").get_attribute("innerHTML")
print(html)

selenium爬虫时间:深圳短租数据

option = webdriver.FirefoxOptions()
option.set_preference('permissions.default.image', 2)
option.set_preference('permissions.default.stylesheet', 2)
firefox = webdriver.Firefox(options=option)
firefox.set_page_load_timeout(5)
firefox.set_script_timeout(5)
try:
    firefox.get(
        "https://www.airbnb.cn/s/%E9%9D%92%E5%B2%9B/homes?host_promotion_type_ids[]=0&host_promotion_type_ids[]=1&host_promotion_type_ids[]=8&checkin=2021-12-30&checkout=2021-12-31")
    divs = firefox.find_elements_by_css_selector("div._8ssblpx")
    for div in divs:
        # 价格  评价数 名称  房屋种类   床数量  房客数量
        str_fangwu = div.find_element_by_css_selector("span._faldii7")
        str_fangwu = str_fangwu.text
        jg = div.find_element_by_css_selector("span._185kh56")
        jg = jg.text
        pjs = div.find_element_by_css_selector("span._1clmxfj")
        pjs = pjs.text
        name = div.find_element_by_css_selector("div._qrfr9x5")
        name = name.text
        print(str_fangwu, jg, pjs, name)
except Exception as e:
    pass
posted @ 2022-01-28 15:09  小旺first  阅读(426)  评论(0)    收藏  举报
顶部