动态网页抓取(案例1.链家经纪人页面分析我们的是动态网页的代码)
优采云 发布时间: 2022-03-16 05:05动态网页抓取(案例1.链家经纪人页面分析我们的是动态网页的代码)
在爬取的时候,有时候我们在网页中看到的数据是一样的,但是抓取到的数据却是不一样的。为什么是这样?这时候,我们很有可能是在抓取动态网页。虽然动态网页的代码没有改变,但显示的内容会随着时间、环境或数据库操作的结果而改变。动态网页通常使用称为 AJAX 的快速动态网页创建技术。AJAX 可以通过在后台与服务器交换少量数据来异步更新网页。那么如何爬取这种网页呢?我们可以考虑使用以下两种方法。
1. 分析页面请求找到真实请求的URL
由于AJAX技术在后台与服务器交互数据,只要有数据发送,就一定有请求发送给服务器,只要找出它加载页面的真实请求,然后构造并发送请求。
2. 使用 Selenium 模拟浏览器行为
Selenium 是一种自动化测试工具,被广泛用作爬虫。在爬虫中,Selenium 主要用于解决动态网页的加载和渲染功能。Selenium 可以使用代码来模拟浏览器的操作,模拟人的操作。您可以将 Selenium 与无头浏览器(例如:phantomjs、无头 Chrome)一起使用来加载和渲染网页,然后提取所需的信息。
案例1.链家经纪人页面分析
我们来分析一下移动端的链家经纪页面。与PC端相比,移动端网页更加简洁简洁。因此,如果一个网页有移动端,我们会优先抓取移动端的网页。打开网页,拉动滚动条,拉到最后,在里面添加一些数据。我们发现NetWork中有很多请求信息,这些请求大部分都是以jpg结尾的图片请求,但是我们可以仔细观察后发现。更多特殊要求如下:
我们继续滑动滚动条,再次找到类似的请求。我们复制请求链接,单独打开,发现是不同broker的请求页面。我们分析了链接,发现后面一个offset的值一直在变化,每增加15,就会请求新的15条数据。所以你,我们只需要改变offset的值来请求不同的页面。至此,我们已经发现了网站 URL的构造规则,接下来就可以编写代码进行爬取了。
# -*- coding: utf-8 -*-
# # @Author: lemon
# # @Date: 2019-09-19 18:18
# # @Last Modified by: lemon
# # @Last Modified time: 2019-09-19 18:42
# # @function: 爬取链家经纪人数据
import requests
import time
from lxml import etree
import pandas as pd
# 存储 DataFrame 中用到的数据
data = {
'姓名': [],
'职位': [],
'评分': []
}
def spider(list_url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
response = requests.get(list_url, headers=headers)
time.sleep(5)
sel = etree.HTML(response.text)
# 先爬取每一位经纪人的整体代码段
agent_list = sel.xpath('//li[@class="pictext flexbox box_center_v lazyload_ulog"]')
for agent in agent_list:
agent_name = agent.xpath('div/div[2]/div[1]/span[1]/a/text()')[0].strip() # 姓名
agent_level = agent.xpath('div/div[2]/div[1]/span[2]/text()')[0].strip() # 职位
agent_score = agent.xpath('div/div[2]/div[1]/span[3]/span[1]/text()')[0].strip() # 评分
print(agent_name, agent_level, agent_score)
data['姓名'].append(agent_name)
data['职位'].append(agent_level)
data['评分'].append(agent_score)
def write_data(data):
frame = pd.DataFrame(data)
frame.to_excel('链家经纪人数据.xlsx')
if __name__ == '__main__':
for i in range(10):
# 根据加载的时候 offset 的变化规律, 构造不同页面的 URL
url = 'https://m.lianjia.com/cs/jingjiren/?page_size=15&_t=1&offset=' + str(i * 15)
print(f'正在爬取 page {i + 1}...')
spider(url)
write_data(data)
这是我们最终抓取的经纪人数据:
2. Selenium 请求百度
由于 Selenium 不是 Python 的标准库,我们首先需要安装 Selenium 库。
pip install selenium
Selenium 需要使用 chromedriver 来驱动 Chrome 浏览器。我们需要下载对应操作系统的版本。您可以参考ChromeDriver和Chrome版本对应参考表和ChromeDriver下载链接进行下载安装。
Selenium 使用 chromedriver 时,既可以将 chromedriver 添加到系统的环境变量中,也可以直接在代码中指定 chromedriver 所在目录。
接下来,我们使用 Selenium 访问百度主页
# -*- coding: utf-8 -*-
# # @Author: lemon
# # @Date: 2019-09-19 19:00
# # @Last Modified by: lemon
# # @Last Modified time: 2019-09-19 19:10
# # @function: Selenium 打开百度
# %%1 从 selenium 中引入 webdriver
from selenium import webdriver
driver = webdriver.Chrome('E:\ChromeDriver\chromedriver.exe') # 初始化 webdriver
driver.get('https://www.baidu.com/') # 使用 webdriver 打开百度首页
search_box = driver.find_element_by_xpath('//*[@id="kw"]') # 使用 xpath 找到搜索框
search_box.send_keys('python') # 在搜索框中搜索关键字
submit = driver.find_element_by_xpath('//*[@id="su"]') # 使用 xpath 找到搜索按钮
submit.click() # 点击搜索按钮进行搜索
可以观察到以下效果: 我们的 Chrome 浏览器正在接收来自自动化测试软件的控制
在后续的文章中,我们会给你一个例子:如何使用Selenium爬取新浪微博的网站,进一步加强你对Selenium的使用。