网页抓取是Python中最常见、最有用和最有挑战性的任务之一。正因为如此,这个领域有许多好的Python工具。

一、简介及基本实现

网页爬虫(英文名:Web Spider),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。

Python作为简单而强大的编程语言,拥有便捷、高效的库。Python的urllib和urllib2模块可被用来从网络上获取数据。究极解决方案是使用Python的selenium库和PhantomJS浏览器。

 # 安装selenium库和webdriver(根据浏览器类型) pip install selenium pip install webdriver # 导入库 from selenium import webdriver # 构建浏览器对象 browser = webdriver.Chrome() 

二、浏览器操作

目前最流行的浏览器是Chrome和Firefox。Selenium支持操作这两种浏览器以及其他几种浏览器。我们在此介绍一下Chrome浏览器操作。

1. 打开网页

 # 浏览器打开网页 browser.get('https://www.baidu.com') 

2. 查找元素及元素操作

 # 通过id定位元素,并输入内容 input = browser.find_element_by_id('kw') input.send_keys('Python') # 点击搜索按钮 button = browser.find_element_by_css_selector('.s_btn') button.click() 

3. 等待页面加载

 from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待id为content_left的元素加载完成 wait = WebDriverWait(browser, 10) element = wait.until( EC.presence_of_element_located((By.ID, 'content_left')) ) 

三、数据获取

一旦我们有了一个浏览器实例并且页面已经加载完成,我们可以像使用普通Python库一样获取数据。

1. 简单的提取操作

 # 获取页面源代码 print(browser.page_source) # 查找元素,并提取文本信息 titles = browser.find_elements_by_tag_name('h3') for title in titles: print(title.text) 

2. (CSS选择器)提取需要数据

使用CSS选择器的格式从页面中选择元素。

 # find_element_by_css_selector函数用于返回页面中第一个匹配的元素 link = browser.find_element_by_css_selector('a[target=_blank]') print(link.text) # find_elements_by_css_selector函数用于获取页面中所有匹配的元素 lis = browser.find_elements_by_css_selector('.s-tab-item') for li in lis: print(li.text) 

3. (XPath)提取需要数据

 # find_element_by_xpath函数用于返回页面中第一个匹配的元素 div = browser.find_element_by_xpath('//div[@id="toolTipContainer"]') print(div.text) # find_elements_by_xpath函数用于获取页面中所有匹配的元素 lis = browser.find_elements_by_xpath('//ul[@class="dropdown-menu"]//li') for li in lis: print(li.text) 

四、爬虫实操

我们以百度翻译为例,实现爬虫抓取结果。特别注意,这里需要借助使用Selenium爬取动态页面的技能。

 # 借助XPath查找元素并输入 input = browser.find_element_by_xpath('//*[@id="baidu_translate_input"]') input.send_keys('hello world') # 点击翻译按钮 button = browser.find_element_by_xpath('//*[@id="translate-button"]') button.click() # 等待翻译结果出现 wait.until( EC.presence_of_element_located((By.XPATH, '//*[@id="main-outer"]/div[1]/div[2]/div/div[2]/div[1]/div[2]/div[1]/div[1]/div/p/span')) ) # 获取翻译结果 result = browser.find_element_by_xpath('//*[@id="main-outer"]/div[1]/div[2]/div/div[2]/div[1]/div[2]/div[1]/div[1]/div/p/span') print(result.text) 

五、总结

Python浏览器爬虫是数据获取的重要工具,应该在实战中不断提升,例如使用代理或JS渲染页面时的操作。我们应该学会使用Selenium以及其他库来完善自己的爬虫技能。