爬取前塵無憂python職位信息并保存到mongo數據庫

1.re實現

 1 import re,os
 2 import requests
 3 from requests.exceptions import RequestException
 4 
 5 MAX_PAGE = 10 #最大頁數
 6 KEYWORD = 'python'
 7 headers = {
 8     'User-Agent':
 9         'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
10 }
11 file_name = 're_job51_python.txt'
12 
13 # 獲取網頁源碼
14 def getHtml(page):
15     try:
16         url = 'https://search.51job.com/list/040000,000000,0000,00,9,99,{0},2,{1}.html?'.format(KEYWORD,page)
17         response = requests.get(url,headers=headers)
18         response.encoding = response.apparent_encoding
19         return response.text
20     except RequestException:
21         print('請求出錯')
22         return None
23 
24 # 解析網頁源碼,得到目標信息
25 def getTarget(html):
26     reg = re.compile(
27         r'class="t1 ">.*? <a target="_blank" '
28         'title="(.*?)".*? <span class="t2"><a target="_blank" '
29         'title="(.*?)".*?<span '
30         'class="t3">(.*?)</span>.*?<span '
31         'class="t4">(.*?)</span>.*? <span '
32         'class="t5">(.*?)</span>',
33         re.S)  # 匹配換行符
34     target = re.findall(reg,html)
35     return target
36 
37 
38 # 保存到文本中
39 def save_to_txt(item):
40     with open(file_name,'a',newline='') as f:  # newline參數防止兩行之間有空行
41         for i in range(len(item)):
42             # 最后一個元素換行,非最后則以','隔開
43             if i == len(item)-1:
44                 f.write(item[i])
45                 f.write('\n')
46             else:
47                 f.write(item[i]+',')
48 
49 def main():
50     # 每次執行前檢查文件是否存在,存在則刪除
51     if os.path.exists(file_name):
52         os.remove(file_name)
53 
54     # 分頁爬取
55     for page in range(MAX_PAGE+1):
56         html = getHtml(page)
57         content = getTarget(html)
58         for item in content:
59             save_to_txt(item)
60 
61 if __name__ == '__main__':
62     main()
View Code

?2.xpath實現

  1 import os
  2 import requests
  3 from requests.exceptions import RequestException
  4 from lxml import etree
  5 import pymongo
  6 from spiders.前程無憂.mongo_config import *
  7 
  8 # mongo數據庫設置
  9 client = pymongo.MongoClient(MONGO_URL)
 10 db = client[MONGO_DB]
 11 
 12 MAX_PAGE = 5
 13 KEYWORD = 'python'
 14 headers = {
 15     'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) '\
 16     'Chrome/63.0.3239.132 Safari/537.36'
 17 }
 18 file_name = 'xpath_job51_python.txt'
 19 
 20 # 獲取網頁
 21 def get_html(page):
 22     try:
 23         url = 'https://search.51job.com/list/040000,000000,0000,00,9,99,{},2,{}.html?'.format(KEYWORD,page)
 24         response = requests.get(url,headers=headers)
 25         response.encoding = response.apparent_encoding
 26         return response.text
 27     except RequestException:
 28         return None
 29 
 30 # 解析網頁
 31 def parse_html(html):
 32     # 構造xpath解析對象,可自動修整HTML文本
 33     html = etree.HTML(html)
 34     # 獲取文本 /text()
 35     # 獲取屬性 /@href
 36     # 獲取第i個標簽 /tar_name[i]  從1開始
 37     # normalize-space-->去空格換行符
 38     # position_name = html.xpath('normalize-space(//div[@class="el"]/p/span/a/text())')
 39 
 40     # 職位名稱,
 41     position_names = []
 42     for name in html.xpath('//div[@class="el"]/p/span/a/text()'):
 43         position_name = name.strip()
 44         position_names.append(position_name)
 45 
 46     # 職位地址
 47     position_urls = html.xpath('//div[@class="el"]/p/span/a/@href')
 48 
 49     # 公司名稱
 50     company_names = html.xpath('//div[@class="el"]/span[1]/a/text()')
 51 
 52     # 公司地址
 53     company_urls = html.xpath('//div[@class="el"]/span[1]/a/@href')
 54 
 55     # 位置
 56     locations = html.xpath('//div[@class="el"]/span[@class="t3"]/text()')
 57 
 58     # 薪資
 59     salarys = html.xpath('//div[@class="el"]/span[@class="t4"]/text()')
 60 
 61     # 發布時間
 62     release_dates = html.xpath('//div[@class="el"]/span[4]/text()')
 63 
 64     result = zip(position_names,position_urls,company_names,company_urls,locations,salarys,release_dates)
 65     return result
 66 
 67 
 68 def save_to_txt(element):
 69     with open(file_name,'a',newline='') as f:
 70         for i in range(len(element)):
 71             # data = ','.join(element[i])
 72             if i == len(element)-1:
 73                 f.write(element[i])
 74                 f.write('\n')
 75             else:
 76                 f.write(element[i]+',')
 77 
 78 
 79 def save_to_mongo(element):
 80     keys = ['position_name','position_url','company_name',
 81             'company_url','location','salary','release_date']
 82     result = dict(zip(keys,list(element)))
 83     if db[MONGO_TABLE_XPATH].insert(result):
 84         print('數據成功存儲到mongo數據庫中')
 85         return True
 86     return False
 87 
 88     # 遍歷字典元素
 89     # for k,v in result.items():
 90     #     print(k,':',v)
 91     for key in result:
 92         print(key,':',result[key])
 93 
 94 
 95 
 96 def main():
 97     if os.path.exists(file_name):
 98         os.remove(file_name)
 99     for page in range(1,MAX_PAGE+1):
100         html = get_html(page)
101         elements = parse_html(html)
102         if elements:
103             for element in elements:
104                 save_to_txt(element)
105                 save_to_mongo(element)
106 
107 if __name__ == '__main__':
108     main()
View Code

?



轉載于:https://www.cnblogs.com/ray-mmss/p/9373742.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253982.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253982.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253982.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實驗八——函數定義及調用總結

1.本次課學習到的知識點&#xff1a; (1)學習了數字金字塔。pyramid ()函數功能&#xff0c;函數定義時&#xff0c;形參n決定數字金字塔的層數&#xff1b; (2)不返回結果的函數定義&#xff1a; (3)復數運算&#xff1a; c1x1&#xff08;y1) i&#xff0c;c2x2&#xff08;y…

Apache JMeter 記一次使用HTTP工具POST提交JSON數據進行送積分高并發壓測(二)

一、前言 前面文章已經介紹Apache JMeter的基本概率和如果使用&#xff0c;但作為一個開發人員&#xff0c;自己寫的代碼都應該要好好的COD EREVIEW,好好的自測吧。但是有些場景比如高并發、負載和性能測試的時候&#xff0c;不借助工具是不好進行測試的。Jmter工具設計之初是用…

QT pro文件詳解

1.QT pro文件配置項說明 注釋&#xff1a;注釋是從一行的#開始&#xff0c;到這一行的結束。QT &#xff1a;這個是添加QT項目需要的模塊的&#xff0c;若項目中要排除某個模塊&#xff0c;也可用QT -配置項。TEMPLATE : 這個配置項確定qmake為這個應用程序生成哪種makefile …

可伸縮視頻編碼svc

可伸縮視頻編碼&#xff08;Scalable Video Coding, SVC&#xff09;技術把視頻信號編碼成分層的形式&#xff0c;當帶寬不足時只對基本層的碼流進行傳輸和解碼&#xff0c;但這時解碼的視頻質量不高。當帶寬慢慢變大時&#xff0c;可以傳輸和解碼增強層的碼流來提高視頻的解碼…

【vim】幾種模式的切換

很多初學者啟動vim后&#xff0c;不知道怎么輸入字符&#xff1a;按了半天字母&#xff0c;結果屏幕還是空的。 vim和記事本或WORD不一樣&#xff0c;不是一打開后就可以輸入文字&#xff0c;此時它處于正常模式。 vim一共有4個模式&#xff1a; 正常模式 (Normal-mode) 插入模…

數據結構----順序表與單鏈表(JAVA)

下面為學習順序表和單鏈表的一些基本操作函數&#xff1a; 1 public class SeqList<T> extends Object {2 protected int n;3 protected Object[] element;4 5 public SeqList(int length) {6 this.element new Object[length];7 this.n 0…

SSH初體驗系列--Hibernate--1--環境配置及demo

最近在學hibernate,常見的教程都是搭配mysql,因為公司本地電腦用的是pg,所以就嘗試著做個pg的小demo. 自己也是邊學邊寫&#xff0c;只當是加深印象.話不多說&#xff0c;直接開始; 一) 準備工作; 1) 本地安裝postgresql ,這個不多說&#xff0c;自己去網上下載; 注: 本次使用的…

Qt學習:QAction系列詳解

一、QAction類詳解 【詳細描述】 QAction類提供了抽象的用戶界面action&#xff0c;這些action可以被放置在窗口部件中。 應用程序可以通過菜單&#xff0c;工具欄按鈕以及鍵盤快捷鍵來調用通用的命令。由于用戶期望每個命令都能以相同的方式執行&#xff0c;而不管命令所使用的…

H.264優秀特征

一、主要特性 1、H.264/AVC相對以前的編碼方法&#xff0c;以MPEG-2為例&#xff0c;在圖像內容預測方面提高編碼效率&#xff0c;改善圖像質量的主要特點如下&#xff1a; ● 可變塊大小運動補償&#xff1a; 選擇運動補償大小和形狀比以前的標準更靈活&#xff0c;最小的…

Linux 文件系統 EXT4 的前世今生

在先前關于Linux文件系統的文章中&#xff0c;我寫了一份說明書去介紹Linux文件系統&#xff0c;里面有一些高級的概念&#xff0c;比如說&#xff0c;一切都是文件。我很想去深入地討論更多EXT文件系統的特性的信息。所以&#xff0c;首先讓我們來回答這個問題&#xff1a;什么…

windows 添加開始菜單

C:\Users\用戶名&#xff08;為你設置的電腦名稱&#xff09;\AppData\Roaming\Microsoft\Windows\Start Menu C:\ProgramData\Microsoft\Windows\Start Menu 注&#xff1a;默認狀態下AppData和ProgramData文件夾為隱藏狀態&#xff0c;所以要查看需要先顯示隱藏的文件。 具體…

awesome-go:很全的go語言資源合集

awesome-go:一個很全的go語言框架&#xff0c;庫&#xff0c;軟件合集 前面發過關于awsone-python, awsone django&#xff0c; flask。最近在學習golang&#xff0c;所以找到awsone-go 非常贊的go語言 Audio & 音樂類安全認證 & OAuthCUI數據庫數據庫驅動日期時間Emai…

zabbix監控系列(5)之通過trap模式監控網絡設備

轉載于:https://www.cnblogs.com/liaojiafa/p/7216749.html

struts2框架下的一個簡單的ajax例子

舉個例子 jsp頁面&#xff1a; <% page language"java" import"java.util.*" pageEncoding"utf-8"%> <% String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()":…

C語言的指針初始化特別注意一點

void func2(int *value) { *value 2; /// value為空指針&#xff0c;不能被取值&#xff0c;所以*value是錯誤的 } void func1() { int *p 0;//此處相當于PNULL func2(p); } / void func2(int *value) { *value 2; /// 正確} void func1() { int a0; int *p &…

小程序—九宮格心形拼圖

說明 前幾天在朋友圈看到好幾次這種圖片。 這種圖片&#xff0c;是用九張圖片拼成的一個心形。 感覺很有趣&#xff0c;就上網查了查怎么做&#xff0c;大部分的說法就是用美圖秀秀的拼圖功能來做&#xff0c; 在微信小程序中也有專門做心形拼圖的小程序&#xff0c;我都試了試…

第二部分:志愿錄取標準

第二部分&#xff1a;志愿錄取標準 零、概況一、傳統志愿錄取過程二、平行志愿錄取過程三、17年志愿錄取過程 零、概況自1977年&#xff0c;恢復高考以來&#xff0c;高考錄取標準&#xff0c;作為公平線&#xff0c;都是相當透明的。這部分分享&#xff0c;以錄取標準&#xf…

100. Same Tree

Given two binary trees, write a function to check if they are equal or not. Two binary trees are considered equal if they are structurally identical and the nodes have the same value. 遞歸遍歷左子樹和右子樹 /*** Definition for a binary tree node.* struct T…

關于RTP時間戳及多媒體通信同步的問題/H264關于RTP協議的實現

http://www.rosoo.net/a/201101/10776.html http://hi.baidu.com/fairygardenjoy/blog/item/e56c5cca95829e37b600c88e.html H264關于RTP協議的實現:http://www.rosoo.net/a/201108/14896.html RTP協議包頭的格式&#xff1a; 10~16 Bit為PT域&#xff0c;指的就是負載類型…