python爬虫之selenium的使用[转发]+总结
https://www.cnblogs.com/lweiser/p/11045023.html selenium使用方法
selenium使用流程,selenium本质就是浏览器自动化测试
1.在python中安装selenium模块和webdriver for Chrome、jsonpath(读取json数据用)
联网状态:pip3 install selenium
离线状态:www.pypi.org中下载tar.gz安装, pip3 install selenium_XX.tar.gz,需考虑虚拟环境问题,可以用pip3 list查看安装情况
安装webdriver,把下载的文件chromedriver.exe复制到,C:\users\administrator\appdata\local\google\chrome\application\中,并把该目录加入到环境变量中,这样才能供python调用。
也可以放到python中的scripts目录,只要存在环境变量中的目录就可以。
2.代码-抓取数据写入文件
# 登录并抓取数据
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10) # 全局等待页面数据返回,避免数据未返回就进行下一步操作
driver.get('url')
driver.find_element_by_id('username').send_keys('jack') # 通过id定位input输入框,输入用户名
driver.find_element_by_class_name('loginbtn').click() # 通过class 定位元素,进行点击登录操作
a = driver.find_element_by_xpath('//div[@id="boundlist"]/ul/li[3]') # 通过xpath定位元素 xpath可以通过chrome中复制出来
d = a.find_elements_by_class_name('x')
rets = {}
data = []
count = 0
for i in d:
xxx = i.find_element_by_xpaht('.//td[1]').get_attribute('data')
ret = {}
ret.update({'xxx': xxx})
data.append(ret)
count += 1
rets = dict(code="0", msg="", data=data)
rets_str = json.dumps(rets, ensure_ascii=False, indent = 4) # indent=4 格式化成json文本格式, ensure_ascii=False json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False
# 将数据写入文件
with open('media/files/data.json', 'w', encoding='utf-8') as f:
f.write(rets_str)
3.代码-在ptyhon中读取文件
import jsonpath # 离线安装需到pypi中下载,通过pip3 install jsonpath.tar.gz安装到相应的虚拟环境中,jsonpath用法:https://www.cnblogs.com/youring2/p/10942728.html
# 在django中调用爬取的json文件数据,并可实现查询
class GetSjfxFrsfzhmView(TemplateView): def get(self, request): if 'glks' in request.GET and request.GET['glks']: search_glks = request.GET['glks'] ojb = json.load(open('media/file/data.json', 'r', encoding='utf-8')) data = jsonpath.jsonpath(ojb, '$.data[?("' + search_glks + '" in @.glks)]') #通过request.GET获取前端参数,在jsonpath中查询相关数据 page_index = request.GET.get('page') page_limit = request.GET.get('limit') paginator = Paginator(data, page_limit) page_data = paginator.page(page_index) page_data_info = [x for x in page_data] rets = dict(code="0", msg="", count=len(data), data=page_data_info) else: ojb = json.load(open('media/file/data.json', 'r', encoding='utf-8')) data = jsonpath.jsonpath(ojb, '$.data[*]') page_index = request.GET.get('page') page_limit = request.GET.get('limit') paginator = Paginator(data, page_limit) page_data = paginator.page(page_index) page_data_info = [x for x in page_data] rets = dict(code="0", msg="", count=len(data), data=page_data_info) return HttpResponse(json.dumps(rets, cls=DateEncoder), content_type="application/json")