、跳轉的方式
轉發: forward
重定向: redirect
2、轉發和重定向代碼怎么完成
1、轉發
//請求轉發到/b對應的Servlet
request.getRequestDispatcher("/b").forward(request,response);
2、重定向
response.sendRedirect(request.getContextPath() + "/b");
3、轉發和重定向的區別?
相同點:都可以完成資源的跳轉
不同點:
轉發是request對象觸發的,服務器內部進行轉發
重定向是response對象觸發的,要將重定向的路徑相應給瀏覽器
轉發是一次請求,瀏覽器地址欄上地址不變
重定向是兩次請求,瀏覽器地址欄上的地址發生變化
重定向路徑需要加項目名(webapp跟路徑web目錄)
轉發是在本項目內部完成資源的跳轉
重定向可以完成跨app跳轉,例如可以跳轉到https://www.baidu.com
4、什么時候采用轉發,什么時候采用重定向
1、大部分情況下都使用重定向
2、若想完成跨app跳轉,必須采用重定向
若在上一個資源中向request范圍中存儲了數據,希望在下一個資源中從request范圍中取出,必須使用轉發
3、重定向可以解決瀏覽器的刷新問題
5、重定向解決頁面刷新問題
HTML 使用超級鏈接與網絡上的另一個文檔相連。幾乎可以在所有的網頁中找到鏈接。點擊鏈接可以從一張頁面跳轉到另一張頁面。
HTML 鏈接
如何在HTML文檔中創建鏈接。
(可以在本頁底端找到更多實例)
HTML 超鏈接(鏈接)
HTML使用標簽 <a>來設置超文本鏈接。
超鏈接可以是一個字,一個詞,或者一組詞,也可以是一幅圖像,您可以點擊這些內容來跳轉到新的文檔或者當前文檔中的某個部分。
當您把鼠標指針移動到網頁中的某個鏈接上時,箭頭會變為一只小手。
在標簽<a> 中使用了href屬性來描述鏈接的地址。
默認情況下,鏈接將以以下形式出現在瀏覽器中:
一個未訪問過的鏈接顯示為藍色字體并帶有下劃線。
訪問過的鏈接顯示為紫色并帶有下劃線。
點擊鏈接時,鏈接顯示為紅色并帶有下劃線。
注意:如果為這些超鏈接設置了 CSS 樣式,展示樣式會根據 CSS 的設定而顯示。
HTML 鏈接語法
鏈接的 HTML 代碼很簡單。它類似這樣::
<a href="url">鏈接文本</a>
href 屬性描述了鏈接的目標。.
實例
<a >訪問菜鳥教程</a>
上面這行代碼顯示為:: 訪問菜鳥教程
點擊這個超鏈接會把用戶帶到菜鳥教程的首頁。
提示: "鏈接文本" 不必一定是文本。圖片或其他 HTML 元素都可以成為鏈接。
HTML 鏈接 - target 屬性
使用 target 屬性,你可以定義被鏈接的文檔在何處顯示。
下面的這行會在新窗口打開文檔:
實例
<a>訪問菜鳥教程!</a>
HTML 鏈接- id 屬性
id屬性可用于創建在一個HTML文檔書簽標記。
提示: 書簽是不以任何特殊的方式顯示,在HTML文檔中是不顯示的,所以對于讀者來說是隱藏的。
實例
在HTML文檔中插入ID:
<a id="tips">有用的提示部分</a>
在HTML文檔中創建一個鏈接到"有用的提示部分(id="tips")":
<a href="#tips">訪問有用的提示部分</a>
或者,從另一個頁面創建一個鏈接到"有用的提示部分(id="tips")":
<a >
訪問有用的提示部分</a>
基本的注意事項 - 有用的提示
注釋: 請始終將正斜杠添加到子文件夾。假如這樣書寫鏈接:,就會向服務器產生兩次 HTTP 請求。這是因為服務器會添加正斜杠到這個地址,然后創建一個新的請求,就像這樣:。
圖片鏈接
如何使用圖片鏈接。
在當前頁面鏈接到指定位置
如何使用書簽
跳出框架
本例演示如何跳出框架,假如你的頁面被固定在框架之內。
創建電子郵件鏈接
本例演示如何如何鏈接到一個郵件。(本例在安裝郵件客戶端程序后才能工作。)
建電子郵件鏈接 2
本例演示更加復雜的郵件鏈接。
HTML 鏈接標簽
標簽 | 描述 |
---|---|
<a> | 定義一個超級鏈接 |
如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!
****聲明:此實例僅用于學習 *****
在分析房天下網站,不難發現每個網頁有個重定向,比如:訪問網頁https://cd.esf.fang.com/chushou/3_211293494.htm會跳轉至https://cd.esf.fang.com/chushou/3_211293494.htm?rfss=1-b71f212cbb874a451c-3a 這個網頁,其實兩個地址打開的是同一個網頁
解決方法:在原網頁源代碼中找到重定向網址,request 新網址即可。
response=requests.get(url,headers = headers)
html=response.text
#網頁重定向
pat=re.compile(r'<a class="btn-redir".*?href="(.*?)">點擊跳轉')
url=re.findall(pat,html)[0]
response=requests.get(url,headers = headers)
return response.text
BeautifulSoup4是爬蟲必學的技能。BeautifulSoup最主要的功能是從網頁抓取數據,Beautiful Soup自動將輸入文檔轉換為Unicode編碼,輸出文檔轉換為utf-8編碼。BeautifulSoup支持Python標準庫中的HTML解析器,還支持一些第三方的解析器,如果我們不安裝它,則 Python 會使用 Python默認的解析器,lxml 解析器更加強大,速度更快,推薦使用lxml 解析器。網上相關文章和介紹很多,不在此啰嗦。
temp_dict['房源']=soup.find('title').string
temp_dict['小區'] = soup.find('div',id="xq_message").get_text()
temp_dict['總價']=soup.find('div',class_="tab-cont-right").find('div',class_="trl-item price_esf sty1").get_text()
我們將獲取房源信息的數據保存在一個temp_dict字典中,然后我們定義一個函數傳入一個列表(表頭用)和字典數據,就可以將數據保存在CSV文件中啦。
def save_data_csv(keyword_list,dict_data):
if not os.path.exists('fang.csv'):
with open('fang.csv', "w", newline='', encoding='utf-8') as csvfile: # newline='' 去除空白行
writer = csv.DictWriter(csvfile, fieldnames=keyword_list) # 寫字典的方法
writer.writeheader() # 寫表頭的方法
# 接下來追加寫入內容
with open('fang.csv', "a", newline='', encoding='utf-8') as csvfile: # newline='' 一定要寫,否則寫入數據有空白行
writer = csv.DictWriter(csvfile, fieldnames=keyword_list)
writer.writerow(dict_data) # 按行寫入數據
print("^_^ write success")
感覺寫的還是有點啰嗦。
import re,requests,time,os
from bs4 import BeautifulSoup
from lxml import etree
import json
import csv
def get_html(url):
headers={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36',
'cookie':'city=cd; __utma=147393320.989730142.1589024416.1589024416.1589024416.1; __utmc=147393320; __utmz=147393320.1589024416.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmt_t0=1; __utmt_t1=1; __utmt_t2=1; global_cookie=9ekumblkqetgf7unt5iefiegk1nk9zk41by; logGuid=08b2183e-66fd-4851-8c49-20b9c55f4562; Integrateactivity=notincludemc; csrfToken=ZEhmg2XlXN8rivcJcEqBk4FO; budgetLayer=1%7Ccd%7C2020-05-09%2019%3A41%3A50; g_sourcepage=esf_fy%5Exq_pc; lastscanpage=0; __utmb=147393320.15.10.1589024416; unique_cookie=U_9ekumblkqetgf7unt5iefiegk1nk9zk41by*4',
'authority': 'cd.esf.fang.com',
'path': '/staticsearchlist/EsfListAjax/GetAIDaoGou?pagesize=5',
}
response=requests.get(url,headers = headers)
html=response.text
#網頁重定向
pat=re.compile(r'<a class="btn-redir".*?href="(.*?)">點擊跳轉')
url=re.findall(pat,html)[0]
response=requests.get(url,headers = headers)
return response.text
#print(html)
def get_fang_url(html):
soup = etree.HTML(html)
urls = soup.xpath('//dd/h4[@class="clearfix"]/a/@href')
return urls
def save_data_csv(keyword_list,dict_data):
if not os.path.exists('fang.csv'):
with open('fang.csv', "w", newline='', encoding='utf-8') as csvfile: # newline='' 去除空白行
writer = csv.DictWriter(csvfile, fieldnames=keyword_list) # 寫字典的方法
writer.writeheader() # 寫表頭的方法
# 接下來追加寫入內容
with open('fang.csv', "a", newline='', encoding='utf-8') as csvfile: # newline='' 一定要寫,否則寫入數據有空白行
writer = csv.DictWriter(csvfile, fieldnames=keyword_list)
writer.writerow(dict_data) # 按行寫入數據
print("^_^ write success")
def parse_page(url,html):
#去除網頁html里面的換行,以便更好的獲取數據
html = "".join(line.strip() for line in html.split("\n"))
#定義一個字典
temp_dict={}
soup=BeautifulSoup(html,'lxml')
#采集房源信息
temp_dict['房源']=soup.find('title').string
temp_dict['小區'] = soup.find('div',id="xq_message").get_text()
temp_dict['總價']=soup.find('div',class_="tab-cont-right").find('div',class_="trl-item price_esf sty1").get_text()
temp_dict['戶型']=soup.find('div',class_="trl-item1 w146").find('div',class_="tt").get_text()
temp_dict['建筑面積'] = soup.find('div', class_="trl-item1 w182").find('div', class_="tt").get_text()
temp_dict['單價'] = soup.find('div', class_="trl-item1 w132").find('div', class_="tt").get_text()
temp_dict['詳情頁'] = url
temp_dict['經紀人'] = soup.find('a',id="kesfsfbxq_A01_03_03").get_text()
print(temp_dict)
keyword_list=['房源','小區','總價','戶型','建筑面積','單價','詳情頁','經紀人']
save_data_csv(keyword_list,temp_dict)
#主函數
if __name__ == '__main__':
#構造網址序列
urls=['https://cd.esf.fang.com/house-a016749-b014906/i{}'.format(i) for i in range(1,101)]
for url in urls:
#獲取單頁數據
html = get_html(url)
#獲取單頁上房源的鏈接
new_urls = get_fang_url(html)
for url in new_urls:
new_url = 'https://cd.esf.fang.com' + url
#獲取HTML
html = get_html(new_url)
#解析網頁,保存數據
parse_page(new_url,html)
#防止被禁IP,每訪問完一頁,睡眠5秒
time.sleep(5)
相應的數據就get到了。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。