首页 » 网站建设 » phpvardump排版技巧_运用requests库模拟post请求时json的运用技巧此乃爬虫神技啊

phpvardump排版技巧_运用requests库模拟post请求时json的运用技巧此乃爬虫神技啊

访客 2024-11-16 0

扫一扫用手机浏览

文章目录 [+]

1、GET用于从做事器端获取数据,包括静态资源(HTML|JS|CSS|Image等等)、动态数据展示(列表数据、详情数据等等)。

phpvardump排版技巧_运用requests库模拟post请求时json的运用技巧此乃爬虫神技啊

2、POST用于向做事器提交数据,比如增编削数据,提交一个表单新建一个用户、或修正一个用户等。

phpvardump排版技巧_运用requests库模拟post请求时json的运用技巧此乃爬虫神技啊
(图片来自网络侵删)

对付Post要求,我们可以通过浏览器开拓者工具或者其他外部工具来进行抓包,得到要求的URL、要求头(request headers)以及要求的表单data信息,这三样正好是我们用requests仿照post要求时须要的,范例的写法如下:

单击url点开,就可以在页面右边的Headers页下看到General、Response Headers、Request Headers、Form Data几个模块,

个中General模块能看到要求的方法和要求的URL以及做事器返回的状态码(200(成功) 做事器已成功处理了要求。
常日,这表示做事器供应了要求的网页。

而Response Headers部分,可以看到缓存掌握、做事器类型、返回内容格式、有效期等参数(笔者截图所示,返回的为json文件):

私信

Request Header模块是非常主要的,可以有效地将我们的爬取行为仿照成浏览器行为,应对常规的做事器反爬机制:

个中Content-Type、Cookie以及User-Agent字段较为主要,须要我们布局出来(其他字段大多数时候,不是必须)

由于Cookie字段记录了用户的上岸信息,每次都不同,且同一个cookie存在一定有效期,当我们结合Selenium来组合爬取页面信息时,可以通过selenium完成网页的上岸校验,然后利用selenium提取出cookie,再转换为浏览器能识别的cookie格式,常日代码如下所示:

cookies = driver.get_cookies() #利用selenium原生方法得到cookiesret=''for cookie in cookies: cookie_name=cookie['name'] cookie_value=cookie['value'] ret=ret+cookie_name+'='+cookie_value+';' #ret即为终极的cookie,各cookie以“;”相隔开

紧接着,我们须要布局headers部分(即要求头),我们挑重点的几个字段进行布局:

headers={ 'Host':'.com', 'Referer':'http:///check/index.do', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36', 'X-Requested-With':'XMLHttpRequest', 'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8', 'Cookie':ret #须要上岸后捕获cookie并调用}

我们在网页中点击“确定”按钮,网页则会异步加载,后台发出post要求,取到json文件并渲染到网页表单中,比如我们根据需求填写了部分字段(这些便是我们post要求的data信息),然后不雅观察后台的form data信息:

后台Form data 捕获到的data参数如图:

它类似于字典格式,个中condition键对应的value较为繁芜——列表中包含字典,字典中还有部分函数,个中字符串中既有单引号又有双引号交错。
属于关键信息,page决定了网页的翻页在第几页,而rows则表示每次要求的数据限定的最大行数。

本例中问题的关键是,如何把想要的信息(譬如来源于excel配置文件)通报到condition字段对应的值内,确保Form data信息灵巧可配置,大抵用法如下:

data_search={ 'page':1, 'rows':15, 'condition': \"大众\公众\"大众[\ {\"大众column\"大众:\公众BPM_DEF_NAME\公众,\"大众exp\"大众:\公众like\"大众,\"大众value\"大众:\公众\"大众},\ {\公众column\"大众:\"大众DELETE_STATUS\"大众,\公众exp\公众:\"大众=\"大众,\公众value\"大众:0},\ {\公众column\"大众:\公众TO_CHAR(TO_DATE(CREATE_DATE,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD')\"大众,\公众exp\"大众:\公众>=\"大众,\"大众value\"大众:\"大众YYYY-MM-DD\"大众},\ {\公众column\公众:\公众TO_CHAR(TO_DATE(CREATE_DATE,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD')\"大众,\"大众exp\"大众:\"大众<=\公众,\公众value\"大众:\"大众YYYY-MM-DD\"大众},\ {\"大众column\"大众:\"大众CHECK_TYPE\"大众,\"大众exp\"大众:\公众like\"大众,\"大众value\"大众:\"大众2\"大众},\ {\"大众column\公众:\"大众LOCKED_STATUS\"大众,\公众exp\"大众:\"大众=\"大众,\公众value\公众:0},\ {\公众column\公众:\"大众DELETE_STATUS\"大众,\公众orderType\"大众:\"大众default\"大众,\"大众orderKey\"大众:\"大众\"大众,\"大众direction\公众:\"大众ASC\"大众}\ ]\公众\"大众\公众, #考虑到该字段已经有单引号、双引号,以是只能用三引号来包住这部分代表字符串 'additionalParams':'{}'}data_search_condition=json.loads(data_search['condition']) #将字符串转为列表,方便更新列表(列表中每个元素都是一个单个字典)元素#刷新字典data_search_condition[0]['value']=businessNamedata_search_condition[2]['value']=str(startDate)data_search_condition[3]['value']=str(endDate)data_search['condition']=json.dumps(data_search_condition) #将列表重新转回字符串,作为data_search字典中键“condition”对应的“value”,然后更新字典

上述代码中,data_search实在为字典工具,其键“condition”对应的值(三引号包住部分)为字符串,实质是json格式,我们如何对这部分动态传参呢?

这里须要用到python json包中常用的loads和dumps方法:

1、json.loads()是将json格式工具,转化Python可识别的字典工具。
解码python json格式,可以用这个模块的json.loads()函数的解析方法。

2、json.dumps()是将一个Python数据类型列表进行json格式的编码解析,可以将一个list列表工具,进行了json格式的编码转换。

3、json.dump和json.dumps很不同,json.dump紧张用来json文件读写,和json.load函数合营利用。

上面实例中,便是将data_search['condition'](json,字符串)转换为列表,然后根据列表定位到底层的每个dict字典,末了根据dict[Key]=value的方法进行更新(传参),更新完之后的列表,再通过json.dumps反向转回字符串,这样全体data_search字典中参数就可以灵巧配置,通过外部引入了。

剩下的事情就很大略,交给强大的Requests包完造诣好,示例代码如下:

def get_page(data_search,url): #定义页面解析的函数,返回值为json格式 try: response=requests.post(url=url,headers=headers,data=data_search) if response.status_code==200: return response.json() except requests.ConnectionError as e: print('Error',e.args)

我们还可以选择把做事器返回的json格式内容存到本地(data.json)格式文件或者txt文本,并按照特定缩进(indent=4)进行规则排版,格式化内容,此时要用到json.dump()方法,示例代码如下:

for pageNum in range(1,1000): data_search['page']=str(pageNum) pageContent=get_page(data_search=data_search,url=url) with open('data.json','w',encoding=\"大众utf-8\"大众) as json_file: json.dump(pageContent,json_file,ensure_ascii = False,indent=4) if pageContent==None: print(\公众无符合条件的单据!
\"大众) time.sleep(3) sys.exit(0)

格式化后的json看上去直不雅观不少:

末了感慨一句:爬虫是门技能活,任何一个技能理解地不足透彻,碰到繁芜的问题,可能就要花上很永劫光去试错,譬如本文示例中的字典、json包几个功能的利用,轻微出错,就无法要求到对的数据!

PS:特殊强调一点,有的时候requests.post()方法中data字段不填或者填写有误,做事器有时也会返回200状态码以及相应内容。
这种情形下,我们一定要与手工操作得到的json文件进行比拟,看看我们的传参(多测试几组不同的参数,看返回json内容是否不同)是否真的起到浸染,以免空欢畅一场!

标签:

相关文章

C语言拆分法,技术创新的智慧结晶

随着信息技术的飞速发展,编程语言作为计算机科学的基础,其重要性不言而喻。C语言作为一种经典的编程语言,历经数十年的演变,已经成为了...

网站建设 2024-12-26 阅读0 评论0

C语言数组,程序世界中的数据宝库

在C语言的世界里,数组是一种基本的数据结构,它将多个相同类型的数据元素存储在连续的内存空间中。作为一种强大的数据组织方式,数组在程...

网站建设 2024-12-26 阅读0 评论0

C语言弹窗编程,技术探索与应用方法

弹窗,作为计算机程序与用户交互的重要方式,广泛应用于各类软件和应用程序中。C语言作为一种经典、高效的编程语言,在弹窗编程领域具有广...

网站建设 2024-12-26 阅读0 评论0

朴实河流IT,探寻信息技术中的诗意与哲思

在信息化时代,信息技术已成为推动社会进步的重要力量。在繁华的IT世界里,我们不禁要问:信息技术是否还能保留一份朴实?本文将以此为切...

网站建设 2024-12-26 阅读0 评论0