日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

局部页面切换url为什么不变_python爬虫 - 翻页url不变网页的爬虫探究

發布時間:2023/12/15 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 局部页面切换url为什么不变_python爬虫 - 翻页url不变网页的爬虫探究 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

python爬蟲-翻頁url不變網頁的爬蟲探究

url隨著翻頁改變的爬蟲已經有非常多教程啦,這里主要記錄一下我對翻頁url不變網頁的探究過程。學術菜雞第一次寫CSDN,請大家多多包容~ 如果對你有一點點幫助,請幫我點個贊吧!

翻頁url不變 與 翻頁url改變 有什么區別?

url其實就是鏈接,翻頁url改變的鏈接就是翻頁請求在url中體現的鏈接,比方說很多爬蟲初學者的第一個爬蟲實例:爬取豆瓣電影top250的信息。

注意看這個網站的鏈接!!

這里可以看到控制頁數的參數start直接在url中體現了,改變start=之后的數值就能夠實現翻頁。start=25對應的頁面就是從26開始的電影,start=0對應的頁面就是從1開始的電影。那么只需要控制start之后的數字以25為步長遞增就可以通過for函數實現翻頁。

但是有時候會遇到明明你點擊了翻頁,但url卻不改變的情況,比如這個:

這種情況沒有辦法在python中直接通過改變url實現翻頁。

找到翻頁命令

事實上,控制網頁翻頁總得有一個參數,只是在翻頁url改變的情況中,這個翻頁參數體現在了url中,這使得我們可以通過直接改變url的方式實現翻頁。對于翻頁url不變的情況,我們其實只需要找到翻頁命令所在的位置,然后控制這條命令即可。

下面介紹我找到翻頁命令的一種方式:

  • 打開開發者模式
  • 在打開開發者模式的情況下點擊翻頁
  • 找到翻頁后返回的內容表單 (一般是XHR格式)
  • 查看其headers (注意pages,start,p等字眼)
  • 提取相應的部分,在python中編寫語句實現控制就可以控制翻頁了
  • 爬取去哪兒酒店信息實例

    • 打開開發者模式,并點擊翻頁
    • 找到返回的第二頁內容的表單可以點擊list-preview打開表單預覽,確認這個list確實是服務器返回的第二頁酒店內容這里可以看到list里面的內容確實就是第二頁的酒店內容,那么我們就要尋找這個list是怎么返回的,即它是通過向服務器發送什么命令返回的!!
    • 查看list的headers

    可以發現在Request Headers之下多了一個新的模塊,叫做Request Payload(我之前在CSDN上看到很多帖子,都是講From Data或者Query String Parameters,但是我卻一直沒找到這兩個模塊,只有Request Payload,后來經過高人指點才知道,其實在Request Payload內也有可能隱藏著翻頁的信息,所以我在想不一定要局限在具體的模塊名字,關鍵是找到翻頁之后服務器返回的信息表單,找它的headers有什么與第一頁headers不同的地方)

    • 將Request Payload的內容打開觀察
      觀察Request Payload里的內容,發現這條指令其實是向服務器發送了一些要求,比如說要求了需要查找的酒店所在城市是西安,還指定了查詢的日期。可以看到這里有一條start:20的命令,經過對比第一頁list的同一位置(start:0)發現start:i就是控制返回不同頁面的命令。

    至此我們已經發掘到了翻頁url不變網站的翻頁命令,下面只需要在爬蟲構造headers的時候,加上Request Payload里要求的內容,其中start控制內容由函數參數控制。這樣就實現了控制爬取頁數的操作。除此之外,不難發現我們甚至還可以控制通過控制Request Payload中的city方便地實現對不同城市酒店的爬取。

    代碼

    下面附上完整代碼,由于去哪兒網頁時常加載失敗,所以如果前兩次出現“No targets found”很有可能是由于鏈接網頁失敗,多試幾次就好了。

    • 通過修改main()里的city,可以爬取不同城市的酒店信息。
    • 通過修改getlist()里z的范圍,可以改變爬取頁數。
    • 我沒有對正則提取的內容做任何模糊處理,理論上復制這個代碼就可以運行。
    • 大多數城市直接輸入城市拼音就可以爬到(鏈接失敗就多試幾次),但是北京得用beijing_city。如果有的城市試了很多次都鏈接失敗,可以上去哪兒網手動搜索看看url里的city是怎樣的,手動添加一下就可以了。
    #-*- codeing = utf-8 -*-#@Time : 2020/8/4 9:25 上午#@Author : Tango#@File : hotel_general.py#@Software : PyCharmimport timeimport reimport requestsfrom bs4 import BeautifulSoupimport xlwtimport jsonfindname = re.compile(r'(.*?)')findgrade = re.compile(r'(3|4|("4)).(.*?)')findtotal = re.compile(r'共(.*)條評論')findprice = re.compile(r'(.*)')finddetail = re.compile(r'查看詳情')def askurl(city, i, url): #獲取網頁內容(post) request_payload = { "b": "{bizVersion: "17", cityUrl:" + city + ", cityName: "", fromDate: "2020-08-04", toDate: "2020-08-05", q: "",…}", "bizVersion": "17", "channelId": 1, "cityName": "", "cityType": 1, "cityUrl": city, "comprehensiveFilter": [], "fromAction": "", "fromDate": "2020-08-04", "fromForLog": 1, "hourlyRoom": "false", "level": "", "locationAreaFilter": [], "maxPrice": -1, "minPrice": 0, "num": 20, "q": "", "qFrom": 3, "searchType": 0, "sort": 0, "start": int(i*20), "toDate": "2020-08-05", "userId": "", "userName": "", "uuid": "", "qrt": "h_hlist", "source": "website" } head = { "user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36" } response = requests.post(url, headers=head, data=json.dumps(request_payload)) #headers里表示這里的數據獲取是post方法,所以使用requests.post函數 return response.textdef getlist(city, url): hotellist = [] for z in range(0, 3): # 爬取頁數設置 page = askurl(city, z, url) #爬取第z頁 soup = BeautifulSoup(page, 'html.parser') #是一個樹形結構了 lsts = soup.find_all('div', class_="inner clearfix" ) ##表空判斷 if not lsts: print("No targets found") print("連接到網頁失敗") exit(0) print("鏈接網頁成功,開始爬取數據") number = 1 #非空情況下讀取 for item in lsts: hotel = [] #每個hotel存放一個酒店的信息(列表形式) item = str(item) # 酒店名稱 hotel_name = re.findall(findname, item)[0] hotel.append(hotel_name) # 酒店評分 hotel_grade = re.findall(findgrade, item) temp = list(hotel_grade) if temp: hotel.append(temp[0][0]) hotel.append(temp[0][2]) else: hotel.append(0) hotel.append(0) # 酒店總評分數 hotel_total = re.findall(findtotal, item)[0] hotel.append(hotel_total) # 酒店起步價 hotel_price = re.findall(findprice, item) if len(hotel_price): hotel_price = hotel_price[0] else: hotel_price = 0 hotel.append(hotel_price) # 詳情鏈接 hotel_info = re.findall(finddetail, item)[0] hotel.append(hotel_info) # 寫入hotellist hotellist.append(hotel) print("-----正在爬取第%d條酒店信息-----"%number) number += 1 time.sleep(1.5) time.sleep(7.5) print("第%d頁爬取完成"%(z+1)) return hotellistdef listToExcel(city, list): col = ['酒店名稱', '酒店評分整數', '酒店評分小數', '酒店評價總數', '起步價', '詳情網址'] hotelbook = xlwt.Workbook(encoding = "utf-8", style_compression = 0) hotelsheet = hotelbook.add_sheet("sheet1", cell_overwrite_ok = True) for i in range(len(col)): hotelsheet.write(0, i, col[i]) for i in range(0,len(list)): print("-----正在寫入第%d條酒店信息-----"%(i+1)) item = list[i] for j in range(len(col)): hotelsheet.write(i+1, j, item[j]) hotelbook.save(city + "hotel.xls")def main(): city = "beijing_city" #基本上寫入城市拼音即可,但是北京要寫成beijing_city baseurl = "https://hotel.qunar.com/city/" + city + "/#fromDate=2020-01-01&cityurl=xiamen&toDate=2020-01-02&from=qunarHotel" hotellist = getlist(city, baseurl) listToExcel(city, hotellist) #askurl(baseurl)if __name__ == '__main__': main()

    學會了么 學會了就私信小編 01 領取驚喜哦

    總結

    以上是生活随笔為你收集整理的局部页面切换url为什么不变_python爬虫 - 翻页url不变网页的爬虫探究的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。