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中编撰句子实现控制就可以控制翻页了爬取去哪里饭店信息实例
可以发觉在RequestHeaders之下多了一个新的模块,称作RequestPayload(我之前在CSDN上看见好多贴子,都是讲FromData或则QueryStringParameters,而且我却始终没找到这两个模块,只有RequestPayload网页点赞,后来经过前辈赐教才晓得,虽然在RequestPayload内也有可能隐藏着翻页的信息,所以我在想不一定要局限在具体的模块名子,关键是找到翻页然后服务器返回的信息表单,找它的headers有哪些与第一页headers不同的地方)
至此我们早已开掘到了翻页url不变网站的翻页命令,下边只须要在爬虫构造headers的时侯,加上RequestPayload里要求的内容,其中start控制内容由函数参数控制。这样就实现了控制爬取页数的操作。除此之外,不难发觉我们甚至还可以控制通过控制RequestPayload中的city便捷地实现对不同城市旅馆的爬取。
代码
下边附上完整代码,因为去哪里网页经常加载失败,所以假如前两次出现“Notargetsfound”很有可能是因为链接网页失败,多试几次就好了。
#-*- codeing = utf-8 -*- #@Time : 2020/8/4 9:25 上午 #@Author : Tango #@File : hotel_general.py #@Software : PyCharm import time import re import requests from bs4 import BeautifulSoup import xlwt import json findname = 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.text def 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 hotellist def 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发放惊喜哦