版权声明:本文可能为博主原创文章,若标明出处可随便转载。 https://blog.csdn.net/Jailman/article/details/79162357
这里只是学习一下动态加载页面内容的抓取,并不适用于所有的页面。
使用到的工具就是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和内存