selenium+ Phantomjs爬取动态网页

来源:互联网 发布:常熟淘宝培训 编辑:程序博客网 时间:2024/05/23 00:02

对于动态加载,Selenium+Phantomjs的强大打开网页查看网页源码(注意不是检查元素)会发现要爬取的信息并不在源码里面。Selenium+Phantomjs的强大一方面就在于能将完整的源码抓取到,也就是说,从网页源码无法通过解析得到数据。


# -*- coding: utf-8 -*-import xlsxwriterimport sysreload(sys)sys.setdefaultencoding( "utf-8" )from selenium import webdriverfrom bs4 import BeautifulSoup def get_grade(url):    print(url)    #匿名爬虫    #假定9999端口开启tor服务    service_args = ['--proxy=localhost:9999', '--proxy-type=socks5', ]    driver = webdriver.PhantomJS(executable_path=r"C:\Users\Administrator\Desktop\phantomjs-1.9.7-windows\phantomjs.exe")    driver.get(url)    data = driver.page_source    # print(data)     soup = BeautifulSoup(data, 'lxml')    grades = soup.find_all('tr')    for grade in grades:        global i        if '<td>' in str(grade):            i += 1            print(i)            grade_text =grade.get_text()            print(grade_text)            grade_text = str(grade_text)            city = grade_text[:-13]            worksheet.write(i,0,city)            time = grade_text[-13:-9]            worksheet.write(i,1,time)            subs = grade_text[-9:-7]            worksheet.write(i,2,subs)            s = grade_text[-7:-3]            worksheet.write(i,3,s)            grade = grade_text[-3:]            worksheet.write(i,4,grade) i = -1workbook = xlsxwriter.Workbook('grades.xlsx')worksheet = workbook.add_worksheet()worksheet.set_column('A:A',10)worksheet.set_column('B:B', 10)worksheet.set_column('C:C', 10)worksheet.set_column('D:D', 10)worksheet.set_column('E:E', 10) urls = ['http://gkcx.eol.cn/soudaxue/queryProvince.html?page='+str(num)        for num in range(1,166)] for url in urls:    get_grade(url)workbook.close()


http://gkcx.eol.cn/soudaxue/queryProvince.html?page=1
0
西藏2016理科本科一批425
1
西藏2016文科本科一批440
2
新疆2016理科本科一批464
3
新疆2016文科本科一批487
4
宁夏2016理科本科一批465
5
宁夏2016文科本科一批516
6
广西2016理科本科一批502
7
广西2016文科本科一批545
8
内蒙古2016理科本科一批484
9
内蒙古2016文科本科一批477
http://gkcx.eol.cn/soudaxue/queryProvince.html?page=2
10
青海2016理科本科一批416
11
青海2016文科本科一批457
12
甘肃2016理科本科一批490
13
甘肃2016文科本科一批504
14
陕西2016理科本科一批470
15
陕西2016文科本科一批511
16
云南2016理科本科一批525


问题 1.爬取速度慢 2没有开多线程

解决办法 直接获取json 一次性找出包含要抓取信息的js文件,之后就是构造requests请求对象,然后解析json文件



# -*- coding: utf-8 -*-import requestsdef save(school_datas):    for data in school_datas:        # print(data)        year = data['year']        province = data['province']        type = data['type']        bath = data['bath']        score = data['score']        print(province, year, type, bath,score )for i in range(1, 34):    print("%s====================="%str(i))    # url = "http://data.api.gkcx.eol.cn/soudaxue/queryProvince.html?messtype=jsonp&url_sign=queryprovince&province3=&year3=&page=1&size=100&luqutype3=&luqupici3=&schoolsort=&suiji=&callback=jQuery1830426658582613074_1469201131959&_=1469201133189"    data = requests.get("http://data.api.gkcx.eol.cn/soudaxue/queryProvince.html", params={"messtype":"json","url_sign":"queryprovince","page":str(i),"size":"50","callback":"jQuery1830426658582613074_1469201131959","_":"1469201133189"}).json()    print("每一页信息条数——>", len(data['school']))    print("全部信息条数——>", data["totalRecord"]['num'])    school_datas = data["school"]    save(school_datas)


第1页=====================
('\xe6\xaf\x8f\xe4\xb8\x80\xe9\xa1\xb5\xe4\xbf\xa1\xe6\x81\xaf\xe6\x9d\xa1\xe6\x95\xb0\xe2\x80\x94\xe2\x80\x94>', 50)
('\xe5\x85\xa8\xe9\x83\xa8\xe4\xbf\xa1\xe6\x81\xaf\xe6\x9d\xa1\xe6\x95\xb0\xe2\x80\x94\xe2\x80\x94>', u'1734')
(u'\u897f\u85cf', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'425')
(u'\u897f\u85cf', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'440')
(u'\u65b0\u7586', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'464')
(u'\u65b0\u7586', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'487')
(u'\u5b81\u590f', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'465')
(u'\u5b81\u590f', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'516')
(u'\u5e7f\u897f', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'502')
(u'\u5e7f\u897f', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'545')
(u'\u5185\u8499\u53e4', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'484')
(u'\u5185\u8499\u53e4', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'477')
(u'\u9752\u6d77', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'416')
(u'\u9752\u6d77', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'457')
(u'\u7518\u8083', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'490')
(u'\u7518\u8083', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'504')
(u'\u9655\u897f', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'470')
(u'\u9655\u897f', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'511')
(u'\u4e91\u5357', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'525')
(u'\u4e91\u5357', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'560')
(u'\u8d35\u5dde', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'473')
(u'\u8d35\u5dde', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'551')
(u'\u56db\u5ddd', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'532')
(u'\u56db\u5ddd', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'540')
(u'\u6d77\u5357', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'602')
(u'\u6d77\u5357', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'653')
(u'\u5e7f\u4e1c', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'508')
(u'\u5e7f\u4e1c', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'514')
(u'\u6e56\u5357', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'517')
(u'\u6e56\u5357', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'530')
(u'\u6e56\u5317', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'512')
(u'\u6e56\u5317', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'520')
(u'\u6cb3\u5357', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'523')
(u'\u6cb3\u5357', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'517')
(u'\u5c71\u4e1c', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'537')
(u'\u5c71\u4e1c', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'530')
(u'\u6c5f\u897f', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'529')
(u'\u6c5f\u897f', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'523')
(u'\u798f\u5efa', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'465')
(u'\u798f\u5efa', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'501')
(u'\u5b89\u5fbd', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'518')
(u'\u5b89\u5fbd', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'521')
(u'\u6d59\u6c5f', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'600')
(u'\u6d59\u6c5f', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'603')
(u'\u6c5f\u82cf', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'353')
(u'\u6c5f\u82cf', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'355')
(u'\u9ed1\u9f99\u6c5f', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'486')
(u'\u9ed1\u9f99\u6c5f', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'481')
(u'\u5409\u6797', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'530')
(u'\u5409\u6797', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'531')
(u'\u8fbd\u5b81', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'498')
(u'\u8fbd\u5b81', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'525')
第2页=====================
('\xe6\xaf\x8f\xe4\xb8\x80\xe9\xa1\xb5\xe4\xbf\xa1\xe6\x81\xaf\xe6\x9d\xa1\xe6\x95\xb0\xe2\x80\x94\xe2\x80\x94>', 50)
('\xe5\x85\xa8\xe9\x83\xa8\xe4\xbf\xa1\xe6\x81\xaf\xe6\x9d\xa1\xe6\x95\xb0\xe2\x80\x94\xe2\x80\x94>', u'1734')
(u'\u5c71\u897f', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'519')
(u'\u5c71\u897f', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'518')
(u'\u6cb3\u5317', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'525')
(u'\u6cb3\u5317', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'535')
(u'\u4e0a\u6d77', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'360')
(u'\u4e0a\u6d77', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'368')
(u'\u91cd\u5e86', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'525')
(u'\u91cd\u5e86', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'527')
(u'\u5929\u6d25', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'512')
(u'\u5929\u6d25', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'532')
(u'\u5317\u4eac', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e00\u6279', u'548')
(u'\u5317\u4eac', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e00\u6279', u'583')
(u'\u65b0\u7586', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e09\u6279', u'363')
(u'\u65b0\u7586', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e09\u6279', u'372')
(u'\u5b81\u590f', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e09\u6279', u'354')
(u'\u5b81\u590f', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e09\u6279', u'406')
(u'\u9752\u6d77', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e09\u6279', u'353')
(u'\u9752\u6d77', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e09\u6279', u'379')
(u'\u7518\u8083', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e09\u6279', u'367')
(u'\u7518\u8083', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e09\u6279', u'391')
(u'\u9655\u897f', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e09\u6279', u'344')
(u'\u9655\u897f', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e09\u6279', u'381')
(u'\u4e91\u5357', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e09\u6279', u'400')
(u'\u4e91\u5357', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e09\u6279', u'445')
(u'\u6d77\u5357', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e09\u6279', u'478')
(u'\u6d77\u5357', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e09\u6279', u'472')
(u'\u6e56\u5357', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e09\u6279', u'396')
(u'\u6e56\u5357', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e09\u6279', u'431')
(u'\u6cb3\u5357', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e09\u6279', u'370')
(u'\u6cb3\u5357', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e09\u6279', u'393')
(u'\u5b89\u5fbd', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e09\u6279', u'446')
(u'\u5b89\u5fbd', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e09\u6279', u'453')
(u'\u6d59\u6c5f', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e09\u6279', u'270')
(u'\u6d59\u6c5f', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e09\u6279', u'267')
(u'\u6c5f\u82cf', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e09\u6279', u'265')
(u'\u6c5f\u82cf', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e09\u6279', u'282')
(u'\u9ed1\u9f99\u6c5f', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e09\u6279', u'309')
(u'\u9ed1\u9f99\u6c5f', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e09\u6279', u'322')
(u'\u5409\u6797', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e09\u6279', u'286')
(u'\u5409\u6797', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e09\u6279', u'275')
(u'\u5929\u6d25', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e09\u6279', u'336')
(u'\u5929\u6d25', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e09\u6279', u'320')
(u'\u5317\u4eac', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e09\u6279', u'438')
(u'\u5317\u4eac', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e09\u6279', u'488')
(u'\u65b0\u7586', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e8c\u6279', u'394')
(u'\u65b0\u7586', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e8c\u6279', u'415')
(u'\u5b81\u590f', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e8c\u6279', u'434')
(u'\u5b81\u590f', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e8c\u6279', u'486')
(u'\u5e7f\u897f', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e8c\u6279', u'333')
(u'\u5e7f\u897f', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e8c\u6279', u'400')
第3页=====================
('\xe6\xaf\x8f\xe4\xb8\x80\xe9\xa1\xb5\xe4\xbf\xa1\xe6\x81\xaf\xe6\x9d\xa1\xe6\x95\xb0\xe2\x80\x94\xe2\x80\x94>', 50)
('\xe5\x85\xa8\xe9\x83\xa8\xe4\xbf\xa1\xe6\x81\xaf\xe6\x9d\xa1\xe6\x95\xb0\xe2\x80\x94\xe2\x80\x94>', u'1734')
(u'\u5185\u8499\u53e4', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e8c\u6279', u'346')
(u'\u5185\u8499\u53e4', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e8c\u6279', u'375')
(u'\u9752\u6d77', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e8c\u6279', u'380')
(u'\u9752\u6d77', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e8c\u6279', u'415')
(u'\u7518\u8083', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e8c\u6279', u'435')
(u'\u7518\u8083', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e8c\u6279', u'455')
(u'\u9655\u897f', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e8c\u6279', u'423')
(u'\u9655\u897f', u'2016', u'\u6587\u79d1', u'\u672c\u79d1\u4e8c\u6279', u'460')
(u'\u4e91\u5357', u'2016', u'\u7406\u79d1', u'\u672c\u79d1\u4e8c\u6279', u'445')


注意jsonDump jsonLoad 方法使用  简单的数据处理暂不描述了 这个显示的是拉丁文,解决办法很多 不过多描述,

0 0