这里只是学习一下动态加载页面内容的抓取,并不适用于所有的页面。
使用到的工具就是python selenium和phantomjs,另外调试的时候还用了firefox的geckodriver.exe。
首先学习了下怎么在firefox中动态调试内容和抓取元素,这个其实在网页自动化测试中相当实用,想想测试同学每天重复点击业务页面和输入内容得有多痛苦吧。
一开始进展十分不顺利,因为phantomjs和firefox的调试加载的动态内容都不能在源码中有任何的体现,只能找出第一次get页面的内容,条目就30条左右,各种下拉加载,各种研究源码,均以失败告终。
最终我用chrome的开发工具找到了页面内容加载的api地址:
https://www.csdn.net/api/articles?type=more&category=home&shown_offset=0
后边就好办了,先用phantom加载首页,然后去访问api地址,这样循环访问,直到api的status为false,首页推荐的底裤就基本上扒掉了……
代码如下:
# coding=utf8 import json import os import sys from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities reload(sys) sys.setdefaultencoding("utf-8") if os.path.exists("csdn_home.txt"): os.remove("csdn_home.txt") print "csdn_home.txt removed" dcap = dict(DesiredCapabilities.PHANTOMJS) dcap[ "phantomjs.page.settings.userAgent"] = "Mozilla / 5.0 (Windows NT 10.0 Win64 x64) AppleWebKit / 537.36 (KHTML, like Gecko) Chrome / 63.0.3 239.132 Safari / 537.36" br = webdriver.PhantomJS() br.get("https://www.csdn.net/") data = br.find_elements_by_xpath('//ul/li[@class="clearfix"]/div/h2/a') print len(data) with open("csdn_home.txt", "a") as f: for title in data: print title.text f.write(title.text + '\n') print title.get_attribute('href') f.write(title.get_attribute('href') + '\n') while True: br.get("https://www.csdn.net/api/articles?type=more&category=home&shown_offset=0") data = json.loads(br.find_element_by_xpath('//pre').text) if data["status"] == "false": break else: for i in data["articles"]: print i["title"] f.write(i["title"] + '\n') print i["url"] f.write(i["url"] + '\n') f.close() br.quit() # 退出phantomjs,否则phantomjs会一直留有进程,占用cpu和内存