001-urllib讀取網頁

weixin_34087301發表於2018-12-16

正規表示式re

(),代表我們需要括號裡面的東西
不加(),表示全部內容我們都需要

import re

mystr = """<span class \"search_yx_t j\">
  共<em>5830</em>個職位滿足條件
  <span>"""

restr = "<em>(\\d+)</em>"#d+表示和數字有關;():只要裡面的物件
regex = re.compile(restr, re, IGNORECASE)
mylist = regex.findall(mystr)

讀取網頁的三種方式

#py2
#enconding:utf-8
import urllib2

url = "http://www.baidu.com"#urlopen只能處理http,不可以處理https

def download1(url):
  return urllib2.urlopen(url).read()#讀取全部網頁

def download2(url):
  return urllib2.urlopen(url).readlines()#讀取每一行的網頁資料,然後壓入列表

def download3(url):
  response = urllib2.orlopen(url)#網頁抽象為檔案
  while True:
    line = response.readline()#讀取一行
    if not line:
      break

python2 和python3的區別

編碼

一般抓取英文資料用python2,抓取帶中文的資料,就需要用python3

用python2列印中文是,需要在第一行encoding:utf-8

urllib2

獲取一個網頁資料,urllib在python2和python3中有不同的表示

  • python2
urllib2.urlopen(url).read()
# urllib2只可以處理http,不可以處理https
  • python3
urllib2.request(url).read()

python被網站遮蔽:referer

有時候我們請求伺服器的時候,伺服器可以知道通過請求頭中的referer引數,知道是誰在請求它
伺服器如果發現不是瀏覽器在請求他,二是python在請求他。直接502.可以直接拒絕我們的請求。

selenium

我們需要這個東西來模擬瀏覽器。selenium可以操作我們的瀏覽器

抓取智聯招聘

基於selenium庫和selenium.webdriver

import selenium #測試框架
import selennium.webdriver #模擬瀏覽器
import re

mystr = """<span class \"search_yx_t j\">
  共<em>5830</em>個職位滿足條件
  <span>"""

restr = "<em>(\\d+)</em>"#d+表示和數字有關;():只要裡面的物件
regex = re.compile(restr, re. IGNORECASE)
mylist = regex.findall(pagesource)
def getnumberbyname(searchname):
  url = "https://sou.zhaopin.com/?jl=613&kw=" + searchname + "&kt=3"
  driver = selenium.webdriver.Firefox() #呼叫火狐瀏覽器
  driver.get(url) #訪問連結
  pagesource = driver.page_source #抓取網頁原始碼
  driver.close()#關閉
  return mylist[0]

# print getnumberbyname("python") 這是測試函式

pythonlist = ["python", "python 運維", "python 測試", "python 資料", "python web"]
for oystr in pythonlist:
  print pystr, getnumberbyname(pystr)

抓取51job

import selenium #測試框架
import selennium.webdriver #模擬瀏覽器
import re

mystr = """<div class = "rt">
  共67條職位
  <\div>"""


def getnumberbyname(searchname): #可能這裡有一些混亂,手頭沒有python環境就沒測試,大致就先這樣吧
 url="https://search.51job.com/list/240200,000000,0000,00,9,99,"+searchname +",2,1.htmllang=c&stype=&postchannel=0000&workyear=99&cotype=99&degefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&adius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&lin=&specialarea=00&from=&welfare=
 driver = selenium.webdriver.Firefox() #呼叫火狐瀏覽器
 driver.get(url) #訪問連結
 pagesource = driver.page_source #抓取網頁原始碼
 restr = """(\\d+)""" #先抓大,再抓小;尤其是空白字 符出現的時候
 regex = re.compile(restr, re.IGNORECASE)
 mylist = regex.findall(pagesource)
 newstr = mylist[0].strip()
 driver.close()#關閉
 return mylist[0]

pythonlist = ["python", "python 運維", "python 測試", "python 資料", "python web"]
for oystr in pythonlist:
  print pystr, getnumberbyname(pystr)

相關文章