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

python爬虫-翻页url不变网页的爬虫探究

url随着翻页改变的爬虫已经有非常多教程啦,这里主要记录一下我对翻页url不变网页的探究过程。学术菜鸡第一次写CSDN,请大家多多包容~ 如果对你有一点点帮助,请帮我点个赞吧!

翻页url不变 与 翻页url改变 有什么区别?

url其实就是链接,翻页url改变的链接就是翻页请求在url中体现的链接,比方说很多爬虫初学者的第一个爬虫实例:爬取豆瓣电影top250的信息。

注意看这个网站的链接!!

801ffa05e0d0b464db16c391c468f0fb.png

这里可以看到控制页数的参数start直接在url中体现了,改变start=之后的数值就能够实现翻页。start=25对应的页面就是从26开始的电影,start=0对应的页面就是从1开始的电影。那么只需要控制start之后的数字以25为步长递增就可以通过for函数实现翻页。

但是有时候会遇到明明你点击了翻页,但url却不改变的情况,比如这个:

ee12ae3195fc033b214e5c24df782525.png

这种情况没有办法在python中直接通过改变url实现翻页。

找到翻页命令

事实上,控制网页翻页总得有一个参数,只是在翻页url改变的情况中,这个翻页参数体现在了url中,这使得我们可以通过直接改变url的方式实现翻页。对于翻页url不变的情况,我们其实只需要找到翻页命令所在的位置,然后控制这条命令即可。

下面介绍我找到翻页命令的一种方式:

  1. 打开开发者模式
  2. 在打开开发者模式的情况下点击翻页
  3. 找到翻页后返回的内容表单 (一般是XHR格式)
  4. 查看其headers (注意pages,start,p等字眼)
  5. 提取相应的部分,在python中编写语句实现控制就可以控制翻页了

爬取去哪儿酒店信息实例

  • 打开开发者模式,并点击翻页
  • 找到返回的第二页内容的表单可以点击list-preview打开表单预览,确认这个list确实是服务器返回的第二页酒店内容这里可以看到list里面的内容确实就是第二页的酒店内容,那么我们就要寻找这个list是怎么返回的,即它是通过向服务器发送什么命令返回的!!
  • 查看list的headers
728343539faecde285ae21074b24588b.png

可以发现在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 领取惊喜哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vtune mysql user_intel vtune 介绍、安装和使用

intel vtune 介绍intel vtune 安装包下载地址intel VTune™ Amplifier 2019 安装手册 - Linux* OS:intel VTune™ Amplifier 用户使用手册安装步骤:Intel VTune Amplifier在Linux环境下的安装: $tar zxvf vtune_amplifie_2018_update3.tar.gz $cd vtune…

python波峰波谷算法_波动均分算法

波动均分算法by leeenx on 2018-01-11「波动」和「均分」大部分读者朋友是知道的,但看到「波动均分」应该是一头雾水的。其实,这个名词是笔者拼凑出来的。什么是「波动均分」?把指定的数值 A,分成 N 份,此时每份的数值…

formatter java_Java编程中的Java Formatter是什么?

Java编程中的Java Formatter是什么?作者:admin分类:PHP, JAVA, .NET文章时间:2017-03-30 21:13:02点击量:1428Java Formatter是一个实用程序类,可以在Java中使用格式化流输出时使生存变得简单。 它的构建类…

python计算矩阵方程_python/sympy求解矩阵方程的方法

sympy版本:1.2假设求解矩阵方程AXA2X其中求解之前对矩阵方程化简为(A−2E)XA令B(A−2E)使用qtconsole输入下面程序进行求解In [26]: from sympy import *In [27]: from sympy.abc import *In [28]: AMatrix([[4,2,3],[1,1,0],[-1,2,3]])In [29]: AOut[29]:Matrix([[ 4, 2, 3],[…

java web 注册登录_javaweb实现登录注册功能实例

前期呢,我们学习了javaweb项目用JDBC连接数据库,还有数据库的建表功能,今天,我们来看一下javaweb实现登录注册功能实例,javaweb项目使用的工具是eclipse,最后把项目部署在了Tomcat中,连接数据库…

source insight 函数不能跳到definition_小技能: Windows10突然不能复制粘贴谁搞鬼

最近连续遇到几次,电脑突然不能复制粘贴了,非常影响工作。(如果不想听我扯,就直接跳到最后看结果啊,我真贴心。)你们都懂得,程序员嘛,用的最多的就是ctrlc,ctrlv。这不能用了,不是让…

flip java_java的flip(). 这里用flip()有什么作用?这是反转缓冲区的方法,好像用不上。...

publicclassNServer{//用于检测所有Channel状态的SelectorprivateSelectorselectornull;staticfinalintPORT30000;privateCharsetcharsetCharset.forName("UTF-8");publicvoidinit(...public class NServer{// 用于检测所有Channel状态的Selectorprivate Selector se…

hsv 明度的范围_通过HSV转换的方式实现图片数据增强

在我的上一篇文章中,我记录了自己将MOT17-Det数据集转换成VOC格式:HUST小菜鸡:将MOT17-Det数据集转成VOC格式​zhuanlan.zhihu.com但是在后期的测试过程中,发现了一些小问题:首先是train.txt里面写入的图片数和标注的数…

java数组如何相加_java数组排序,并将数组内的数据求和

java数据编列并求和,江湖我狼哥,人狠话不多,直接上代码!import java.util.Arrays;public class Intarry {public static void main (String[] args){//定义一个数组int intarry[] {20,30,40,10};int num0;Arrays.sort(intarry);/…

python在工厂中的应用_什么是工厂函数?Python 中工厂函数怎么理解?

其实谈工厂函数前必须首先把嵌套作用域和闭包讲清楚python有一个很有意思的地方,就是def函数可以嵌套在另一个def函数之中。调用外层函数时,运行到的内层def语句仅仅是完成对内层函数的定义,而不会去调用内层函数,除非在嵌套函数之…

java protected关键字_Java 权限protected关键字纠正

以前一直认为自己理解了Java四种权限访问,昨天突然编程时发现protected居然在子类中不能调用,然后越看越迷糊??????public: Java语言中访问限制最宽的修饰符,…

老版本fortran语言 内存无效_编程语言的分类

编程语言世代第一代和第二代语言又称低级语言(Low-level language),其余被视为高级语言(High-level language)第一代编程语言即机器语言,由0和1构成,通过面板、打孔带或者打孔卡输入。第二代编程…

金融统计分析python论文_比较好写的本科金融专业论文题目 本科金融专业论文题目怎么取...

为论文写作提供【100道】比较好写的本科金融专业论文题目,海量本科金融专业相关论文题目,包括专科与本科以及硕士论文题目,解决您的本科金融专业论文题目怎么取的相关难题!一、比较好写的本科金融专业论文题目:1、微观金融视角下财务管理专业应用型本科人才培养目标…

互联网java常用框架_来,带你鸟瞰 Java 中4款常用的并发框架!

1. 为什么要写这篇文章几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库。 但是,当深入实现细节时,我们想起了一位智者曾经说过的话:“细…

2020亚太杯数学建模_比赛 | 2020年APMCM亚太地区大学生数学建模竞赛

2020年11月26日到30日,在我院老师指导下,由统计分析竞赛社组织的41支队伍,共123人,参加了亚太地区大学生数学建模竞赛组委会主办的大学生学科类竞赛。此次竞赛题目分为A题和B题,参赛者需从A,B两题中任选其一…

java声明复数类_JAVA声明复数类

声明复数类,成员变量包括实部和虚部,成员方法包括实现由字符串构造复数、复数加法、减法,字符串描述、比较相等等操作。虽然我只是一个刚学一个月JAVA的菜鸡,但是强迫症让我把复数乘法和除法一起写出来了。public class Complex {…

python接口测试非json的断言_荐在接口自动化测试中,如何利用Pytest + JSONPath 进行接口响应断言...

之前有一篇文章,介绍了如何使用JSONSchema对接口响应进行断言,主要的适用场景是对响应的数据结构进行校验,保证客户端收到的数据结构稳定和合法。今天,介绍使用JSONPath对接口响应的值进行断言方法。上一篇文章《在接口自动化测试…

python3中异常处理_python中的五种异常处理机制介绍|python3教程|python入门|python教程...

https://www.xin3721.com/eschool/python.html从几年前开始学习编程直到现在,一直对程序中的异常处理怀有恐惧和排斥心理。之所以这样,是因为不了解。这次攻python,首先把自己最畏惧和最不熟悉的几块内容列出来,里面就有「异常处理…

java static 单例模式_Java 单例模式全面学习

介绍什么是单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点解决什么问题:省略创建对象所花费的时间,不需要频繁创建对象,减轻 GC 压力。单例模式有以下几种实现方式:懒汉式第一次使用的时候…

sql 没有调试 菜单_MySQL递归查询上下级菜单

正文在传统的后台管理系统里面经常会需要展示多级菜单关系,今天我们来学一下如何使用一条SQL语句展示多级菜单。现在我们有一张corpinfo单位表,里面有一个belong字段指向上级单位,首先来看一下现在表里有什么数据:SELECT uid,ubel…