如何抓取动态页面
2017-05-02
介绍
目前许多网站大量运用 javascript 脚本进行一些页面的处理,这些页面的抓取对爬虫是个挑战。 这类页面的抓取,有到了下面几种方法
- 分析页面(firebug/chrome调试工具 等),找到ajax获取的数据源,看是否可以直接发请求获取
- 调用无界面依赖的浏览器引擎(headless browser) casperjs,phantomjs 获取最后的页面
第一种方法就不说了,大家自己分析下,主要说下第二种
用 selenium + phantomjs 抓取动态页面
- pip 安装 selenium
pip install selenium
- 去 phantomjs 下载 下载对应的包安装
- 用下面的脚本测试
#!/usr/bin/env python
# coding: utf-8
from selenium import webdriver
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver import ActionChains
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import bs4 as bs
def main():
# 设置 user agent
dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap['phantomjs.page.settings.userAgent'] = (
'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0'
)
driver = webdriver.PhantomJS(desired_capabilities=dcap)
# 通过主页面获取相关session
driver.get('http://www.lagou.com')
driver.get('https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=')
# 解析页面
soup = bs.BeautifulSoup(driver.page_source, 'html.parser')
# 使用 css 选择器
items = soup.select('.con_list_item')
# 输出招聘信息
for item in items:
print('*' * 80)
print(item['data-company'])
print(item['data-positionname'])
print(item['data-salary'])
# print(item)
if __name__ == '__main__':
main()