中國海洋石油是爬取的第一個企業,以後依次爬取了,國家電網,中國郵政,這三家公司的源碼並無多大難度,javascript
採購信息地址:html
國家電網電子商務平臺java
http://ecp.sgcc.com.cn/project_list.jsp?site=global&column_code=014001001&project_type=1python
中國海洋石油集團有限公司git
https://buy.cnooc.com.cn/cbjyweb/001/001001/moreinfo.htmlgithub
中國郵政web
http://www.chinapost.com.cn/html1/category/181313/7294-1.htmsql
項目地址:瀏覽器
https://github.com/code-return/Crawl_fawjsp
中海油的信息頁面很友好,並無多大難度,實現順序以下:
#獲取首頁內容 def get_one_page(url): ... #解析網頁 def parse_one_page(html): ... #獲取最大頁碼 def getMaxpage(html): ... #獲取二級頁面的文本內容 def getContent(url): ... #主函數 def main(): url = "https://buy.cnooc.com.cn/cbjyweb/001/001001/moreinfo.html" html = get_one_page(url) parse_one_page(html) page_num = getMaxpage(html) #拼接翻頁的url,並返回翻頁的源代碼 for i in range(2,page_num + 1): next_url = url.replace('moreinfo',str(i)) next_html = get_one_page(next_url) parse_one_page(next_html)
在主函數中需實現翻頁爬取的功能,這裏經過先獲取網頁最大頁碼,而後根據頁碼設置循環,咱們從第二頁開始解析網頁。
在網頁解析函數parse_one_page(html)中,主要實現,獲取網頁中的標題,發佈時間,href,獲取該內容以後對數據進行篩選,存儲
def time_restrant(date): # 時間判斷函數,判斷是否當年發佈的消息 thisYear = int(datetime.date.today().year) thisMonth = int(datetime.date.today().month) thisday = int(datetime.date.today().day) year = int(date.split('-')[0]) month = int(date.split('-')[1]) day = int(date.split('-')[2]) #if ((thisYear - year <= 1) or (thisYear - year == 2 and month >= thisMonth)): # 爬取24個月內的信息 # if (thisYear == year and month == thisMonth and day == thisday): # 這裏是設置時間的地方 #if (thisYear == year and month == thisMonth): if (thisYear == year): #if thisYear == year: return True else: return False
def title_restraint(title,car_count, true_count): # 標題判斷函數,判斷標題中是否有所須要的「車」的內容 global most_kw_arr global pos_kw_arr global neg_kw_arr car_count += 1 if title.find(u"車") == -1: # or title.find(u"採購公告"): return False,car_count, true_count else: #car_count += 1 neg_sign = 0 pos_sign = 0 for neg_i in neg_kw_arr: if title.find(neg_i) != -1: # 出現了d_neg_kw中的詞 neg_sign = 1 break for pos_i in pos_kw_arr: if title.find(pos_i) != -1: # 出現了d_pos_kw中的詞 pos_sign = 1 break if neg_sign == 1: return False,car_count, true_count else: if pos_sign == 0: return False,car_count, true_count elif pos_sign == 1: true_count += 1 return True,car_count, true_count
將數據篩選完畢以後,對數據進行存儲
def store(title, date, content, province, url): # 向nbd_message表存儲車的信息 title, content = removeSingleQuote(title, content) sql = "insert into nbd_message (title,time,content,province,href) values('%s','%s','%s','%s','%s')" % ( title, date, content, province, url) return mySQL("pydb", sql, title, date, province) def store_nbd_log(car_count, true_count, province_file): # 向nbd_spider_log表存儲爬取日誌信息 sql = "insert into nbd_spider_log (total_num,get_num,pro_name,spider_time) values('%d','%d','%s','%s')" % ( car_count, true_count, province_file,str(datetime.date.today())
流程結束
郵政的頁面更加單一,可是郵政問題在於,
其每一個單位都有單獨的連接來展現其不一樣業務部門的招標信息,通過對比我發現,這個下屬部門的首頁連接,就差了最後一點不同,所以我偷了個懶,多加了個循環
def main(): """ urls中分別對應着集團公司,省郵政分公司,郵政儲蓄銀行,中郵保險,集團公司直屬單位 """ urls = ['7294-','7331-','7338-','7345-','7360-'] for i in range(0,len(urls)): strPost = '1.htm'#url後綴 base_url = "http://www.chinapost.com.cn/html1/category/181313/" + str(urls[i]) url = base_url + strPost html = get_one_page(url) # print(html) parse_one_page(html) page_num = getMaxpage(html) getMaxpage(html) for i in range(2,page_num + 1): next_url = base_url + strPost.replace('1',str(page_num)) next_html = get_one_page(next_url) parse_one_page(next_html)
郵政完成
國家電網是我遇到的第一個問題,他的問題在於,在所須要的每一個公告裏面的href中,給出的不是一般的二級頁面連接,而是JavaScript的兩個參數,
href=」javascript:void(0);」這個的含義是,讓超連接去執行一個js函數,而不是去跳轉到一個地址, 而void(0)表示一個空的方法,也就是不執行js函數。 爲何要使用href=」javascript:void(0);」 javascript:是僞協議,表示url的內容經過javascript執行。void(0)表示不做任何操做,這樣會防止連接跳轉到其餘頁面。這麼作每每是爲了保留連接的樣式,但不讓連接執行實際操做, <a href="javascript:void(0)" onClick="window.open()"> 點擊連接後,頁面不動,只打開連接 <a href="#" onclick="javascript:return false;"> 做用同樣,但不一樣瀏覽器會有差別
而二級頁面的連接與屬性onclick裏面的兩個數字有關!!!所以我用onclick的兩個參數,進行二級頁面的拼接,
hrefAttr = selector.xpath("//*[@class='content']/div/table[@class='font02 tab_padd8']/tr/td/a/@onclick") for i in range(0,len(hrefAttr)): #獲取二級頁面的跳轉參數,以便進行二級頁面url拼接 string = str(hrefAttr[i]) attr1 = re.findall("\d+",string)[0] attr2 = re.findall("\d+",string)[1]
繼續搬磚......