Python爬虫(一) 信息系统集成及服务资质网
警告:不要惡意的訪問網站,僅供學習使用!
本教程實例只抓取信息系統集成及服務資質網的企業資質查詢。
1. 抓包
打開谷歌瀏覽器的開發者工具并訪問該網站,過濾請求后找到請求數據的包。
1.1 找到相應封包
1.2 分析(解析)參數a
參數a的值先base64解密,在進行2次url解密得到如下結果:
["{\"parameters\":[{\"name\":\"type\",\"value\":1,\"flag\":11,\"group\":null}],\"order\":\"approvaldate desc,qualificationlevel,createtime\",\"pageNum\":1,\"pageSize\":200,\"name\":\"miitzzbcompany\",\"getCodeValue\":true,\"codetypes\":[{\"name\":\"qualificationlevel\",\"code\":\"MIITTYPE\"}],\"isgis\":false,\"javaClass\":\"com.longrise.LEAP.BLL.Cache.SearchBuilder\"}"]這里面可以看出是json格式的參數,而控制翻頁的參數是pageNum,pageSize:200是代表請求的每頁數據200條(網站默認200條/頁);
因為字符\為轉義字符,故在編程時候需要用\\來替代。
1.2 分析(解析)返回結果
分析結果一般是為了進行處理,存儲數據做準備的;
不過現在的這個返回結果的內容過于豐富,除了必要的企業信息,竟然還有很全面的信息概況(提前知道頁數、總條數等會變得主動);如下圖:
我這里不進行處理存儲了,只是進行測試訪問。
2. python編程: urllib2, requests
這里只要構造一個post封包請求即可。
我用三種方法(工具)來進行測試;
2.1 urllib2
#-*- coding:utf-8 –*- 定義源代碼的編碼 #!/usr/bin/env python ''' Created on 2016年10月15日 @author: baoluo ''' import sys import urllib import urllib2 import cookielib import base64 import time import logging#reload(sys) #sys.setdefaultencoding("utf-8") #設置默認的string的編碼格式 urllib2.socket.setdefaulttimeout(60) #全局:超時時間(s)class Browser(object): def __init__(self): super(Browser, self).__init__() sys.stdout.flush() self.cookie = cookielib.CookieJar() self.handler = urllib2.HTTPCookieProcessor(self.cookie) self.opener = urllib2.build_opener(self.handler) urllib2.install_opener(self.opener)def addHeaders(self, name, value): self.opener.addheaders.append((name, value))def doGet(self, url): req = urllib2.Request(url) req = self.opener.open(req) return reqdef doPost(self, url, payload = None): req = urllib2.Request(url, data = payload) req = self.opener.open(req) return reqclass GetTable(object): """docstring for GetTable""" def __init__(self): super(GetTable, self).__init__() self.browser = Browser()def getParameter(self,page_index): a = '["{\\"parameters\\":[{\\"name\\":\\"type\\",\\"value\\":1,\\"flag\\":11,\\"group\\":null}],\\"order\\":\\"approvaldate desc,qualificationlevel,createtime\\",\\"pageNum\\":' + str(page_index) + ',\\"pageSize\\":100,\\"name\\":\\"miitzzbcompany\\",\\"getCodeValue\\":true,\\"codetypes\\":[{\\"name\\":\\"qualificationlevel\\",\\"code\\":\\"MIITTYPE\\"}],\\"isgis\\":false,\\"javaClass\\":\\"com.longrise.LEAP.BLL.Cache.SearchBuilder\\"}"]' encode1 = urllib.quote(a) encode2 = urllib.quote(encode1) encode3 = base64.urlsafe_b64encode(encode2) return encode3def main(self): url_list2 = "http://www.csi-s.org.cn/LEAP/Service/RPC/RPC.DO?callService=web&method=beanSearch&sid=D00A7D61E08645F21A2E79CDF5B81B05.03&rup=http://www.csi-s.org.cn/&_website_=*" self.browser.addHeaders("Cookie","JSESSIONID=D00A7D61E08645F21A2E79CDF5B81B05.03; Hm_lvt_4cb69a1c792de0898e02ec2bb7eadf7b=1476254714; Hm_lpvt_4cb69a1c792de0898e02ec2bb7eadf7b=1476372505") self.browser.addHeaders('Host', 'www.csi-s.org.cn') self.browser.addHeaders('Origin', 'http://www.csi-s.org.cn') self.browser.addHeaders('Data-Type', '4') self.browser.addHeaders('Post-Type', '1') self.browser.addHeaders('Referer', 'http://www.csi-s.org.cn/LEAP/MIITModule/SystemBag/miitzzbcompanylist2.html') self.browser.addHeaders('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36') for page_index in range(1, 2): post_data = "a=" + self.getParameter(3) #print post_data try: req = self.browser.doPost(url_list2, post_data) if 200 == req.getcode(): res = req.read() print res else: print req.getcode() except Exception, e: print logging.exception(e) finally: time.sleep(3) #等待時間if __name__ == '__main__': GetTable().main()2.2 requests
# -*- encoding: utf8 -*- ''' Created on 2016年10月15日 @author: baoluo ''' import requests import time import sys import os import urllib import base64 import logging import threadingreload(sys) sys.setdefaultencoding( 'utf-8' )class Grab_Data(threading.Thread): def __init__(self): threading.Thread.__init__(self) super(Grab_Data, self).__init__() sys.stdout.flush() self.ses = requests.Session()def doGet(self, url): print '-get-header:',header req = self.ses.get(url, headers=header, timeout=15) return req def doPost(self, url, payload): print '-post-header:',header req = self.ses.post(url, data=payload, headers=header, timeout=30) return reqdef getParameter(self,page_index): a = '["{\\"parameters\\":[{\\"name\\":\\"type\\",\\"value\\":1,\\"flag\\":11,\\"group\\":null}],\\"order\\":\\"approvaldate desc,qualificationlevel,createtime\\",\\"pageNum\\":' + str(page_index) + ',\\"pageSize\\":100,\\"name\\":\\"miitzzbcompany\\",\\"getCodeValue\\":true,\\"codetypes\\":[{\\"name\\":\\"qualificationlevel\\",\\"code\\":\\"MIITTYPE\\"}],\\"isgis\\":false,\\"javaClass\\":\\"com.longrise.LEAP.BLL.Cache.SearchBuilder\\"}"]' encode1 = urllib.quote(a) encode2 = urllib.quote(encode1) encode3 = base64.urlsafe_b64encode(encode2) return encode3def run(self): header['Cookie']= "JSESSIONID=D00A7D61E08645F21A2E79CDF5B81B05.03; Hm_lvt_4cb69a1c792de0898e02ec2bb7eadf7b=1476254714; Hm_lpvt_4cb69a1c792de0898e02ec2bb7eadf7b=1476372505" #header.setdefault('Host', 'www.csi-s.org.cn') #header.setdefault('Origin', 'http://www.csi-s.org.cn') header.setdefault('Data-Type', '4') header.setdefault('Post-Type', '1') header.setdefault('Referer', 'http://www.csi-s.org.cn/LEAP/MIITModule/SystemBag/miitzzbcompanylist2.html')url_list2 = "http://www.csi-s.org.cn/LEAP/Service/RPC/RPC.DO?callService=web&method=beanSearch&sid=D00A7D61E08645F21A2E79CDF5B81B05.03&rup=http://www.csi-s.org.cn/&_website_=*"try: print "page=",page data= "a="+ self.getParameter(page) req = self.doPost(url_list2,data) if 200==req.status_code: print req.text else: print "HttpError:",req.status_code except Exception, e: print "Error" ,sys.exc_info()if __name__ == '__main__': header = {'User-Agent':'Mozilla/5.0 (Windows NT 5.1; rv:28.0) Gecko/20100101 Firefox/28.0'} try: for page in xrange(5,6): t = Grab_Data() t.start() t.join() #break time.sleep(3) #等待時間 except Exception, e: print logging.exception(e)3. python編程: Selenium + openpyxl
#-*- encoding:utf-8 –*- #!/usr/bin/env python ''' Created on 2016年10月16日 @author: baoluo ''' from selenium import webdriver from selenium.webdriver.common.by import By from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.keys import Keys from openpyxl import Workbook from openpyxl import load_workbook from time import sleep,time from datetime import datetime import random import json import sys,os import logging from re import findall reload(sys) sys.setdefaultencoding("utf-8")def now_time():return datetime.now().strftime("%Y-%m-%d %H:%M:%S")class GrabDate(object):"""docstring for GrabDate"""def __init__(self):super(GrabDate, self).__init__()self.browser = webdriver.Chrome()self.browser.set_window_size(1024,777)self.browser.implicitly_wait(10) #設置隱式等待時間def find_element(self, by=By.XPATH, value=None):try: self.browser.find_element(by=by, value=value)except NoSuchElementException, e: return Falsereturn Truedef parser(self):try:if '信息系統集成及服務資質網' in self.browser.title:#切換到iframe表單(內嵌頁面) iframe(id='famebody')self.browser.switch_to.frame('famebody')#獲取總頁數,條數: 1/45頁 1/8953條 200條/頁table_page_info = self.browser.find_element_by_xpath(".//*[@id='childbody']/div[2]/div/font").textprint 'table_page_info: ',table_page_infoif '正在查詢' in table_page_info:returnpageNum = findall(r'\d+/(\d+)頁',str(table_page_info))print "pageNum: ", pageNum#pageNum = 2ep = int(pageNum[0]) #尾頁:ep,默認尾頁是最大頁數sp = 22 #開始頁:sp #設置開始頁、尾頁(適用于中途斷網,或者有選擇的爬)if sp != 1:#輸入起始頁,點擊 跳轉 self.browser.find_element_by_xpath(".//*[@id='childbody']/div[2]/div/input[5]").clear()#清空self.browser.find_element_by_xpath(".//*[@id='childbody']/div[2]/div/input[5]").send_keys(str(sp))self.browser.find_element_by_xpath(".//*[@id='childbody']/div[2]/div/input[6]").click()for page in xrange(sp, ep+1):print str(page)+'/'+str(ep) + "page Time: ",now_time()#切換到iframe表單(內嵌頁面) iframe(id='famebody')if self.find_element(by=By.ID, value="famebody"):self.browser.switch_to.frame('famebody')#查找表格是否加載進來 if self.find_element(value=".//*[@id='childbody']/div[1]/table/tbody"):#獲取當頁 數據的條數table_tbody_tr = self.browser.find_elements_by_xpath(".//*[@id='childbody']/div[1]/table/tbody/tr")print 'list lengh:',len(table_tbody_tr)trs = ['']*7for tr in xrange(1,len(table_tbody_tr)+1):for td in xrange(1,7+1):xpath = ".//*[@id='childbody']/div[1]/table/tbody/tr["+str(tr)+"]/td["+str(td)+"]"trs[td-1] = self.browser.find_element_by_xpath(xpath).text#print trs#一行寫一次self.writeLine_xlsx(trs)# 下一頁self.browser.find_element_by_xpath(".//*[@id='childbody']/div[2]/div/input[3]").click()#等待頁面加載....sleep(3)else:print 'net error'except Exception, e:print logging.exception(e)finally:print '---end---'#self.browser.quitdef writeLine_xlsx(self, _list):fname = u"集成企業資質查詢.xlsx"init = ('序號','企業名稱', '資質證書編號','發證日期','證書有效期','資質等級','所屬省市')#文件不存在則創建if not os.path.isfile('./'+fname):wb = Workbook()ws = wb.activews.freeze_panes = ws["A2"]for i in xrange(len(init)):ws.cell(row=1, column=(i+1), value= init[i])wb.save(fname)wrf = load_workbook(filename = fname)wr = wrf.worksheets[0]#查看當前行數rows_len = len(wr.rows)+1for col in xrange(7):wr.cell(row=rows_len, column=(col+1), value= str(_list[col]))wrf.save(fname)def grab(self):url = 'http://www.csi-s.org.cn/miit_webmap/miit_jcqy/'self.browser.get(url)sleep(5)self.parser() #解析網站if __name__ == '__main__':GrabDate().grab()我只測試了23頁,效率低的很意外。。。
分析了慢的原因主要有2個:解析200條數據和一次寫一行。
就這個程序生成的帶4600條數據(7列)的文檔,我只測試兩種情況:
(一行/條數據指的是 1-7 組成的7列)
a)一次寫一條數據,這樣平均寫一條數據就要2.8秒左右(估計大部分時間都花在文件的開閉了)
from openpyxl import Workbook from openpyxl import load_workbook from time import timet0 = time() print t0 for x in xrange(1,50):print time()fname = 't.xlsx'wrf = load_workbook(filename = fname)wr = wrf.worksheets[0]rows_len = len(wr.rows)+1for col in xrange(7):wr.cell(row=rows_len, column=(col+1), value= str(col))wrf.save(fname)t1=time()print t1 print t1-t0b)一次寫200條數據,這樣只需要20秒左右。
from openpyxl import Workbook from openpyxl import load_workbook from time import timet0 = time() print t0 for x in xrange(1,2):print time()fname = 't.xlsx'wrf = load_workbook(filename = fname)wr = wrf.worksheets[0]for x1 in xrange(200):rows_len = len(wr.rows)+1for col in xrange(7):wr.cell(row=rows_len, column=(col+1), value= str(col))wrf.save(fname)t1=time()print t1 print t1-t0最后放結果:
參考:
1. base64
2. Python進行URL解碼
轉載于:https://www.cnblogs.com/oucbl/p/5971526.html
總結
以上是生活随笔為你收集整理的Python爬虫(一) 信息系统集成及服务资质网的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图片与图片间距去除
- 下一篇: 如何判断cpu是否支持二级地址转换SLA