首页 > 编程语言 >python 爬取网页,带有post参数

python 爬取网页,带有post参数

时间:2022-10-21 11:13:41浏览次数:76  
标签:请求 python list app tr 爬取 href post com

https://blog.csdn.net/weixin_40340586/article/details/119457955

 

记录一下自己的爬虫踩过的坑,上一次倒是写了一些,但是写得不够清楚,这次,写清楚爬取的过程。

这个网站是某省的志愿服务网。

 

 

 

就是它了。

我向爬取一些组织开展过的活动,比如这一个组织,

 

这个组织的页面找打它不存在什么问题,组织的网址只需要拼接就可以了。

看似很容易。

基础网址是:https://sd.zhiyuanyun.com/app/org/view.php?id=(*****)

前面是一堆,后面只需要把id后面的组织的ID放进去就可以,组织的ID也很好找。就是直接从首页一页页爬也行。这个网站的首页也不复杂。

但是现在我要得到这个组织开展的活动列表。

比如这个组织。

 

这个组织开展的活动蛮多的,看出来会有16页,最下面有标签,16.

难点是我怎么能知道最后一个页是16,就是最大的数, 有的组织只有1页,有的7,有的8.我得知道这个最末页的数,才能写一个循环。不能直接写一个while true 来一个break吧。

这时候,就需要研究一下这个网页的请求方式了。

这个网页请求使用的是post,而不是get。如果是get, 那么只能得到的页面是。

 

是这样一个页面,get请求的网址也是没错的。

https://sd.zhiyuanyun.com/app/org/view.php?id=TF86AlHTUWfd6

但是发起的项目这个部分,是看不到的。再仔细研究看看。其实在请求过程中,还有一个js请求。

刚开始我以为是xhr,即ajax,找了半天也没找到。

清空一下网络请求信息,点一下某一页的项目。就会看到一个post请求的

 

 

 

 

这个post请求,复制出来,注意是复制curl (bash)

 

 

 

 https://curlconverter.com/

把这个贴进去 生成请求的网页,就可以得到python的请求代码。

Convert curl command syntax to Python requests, Ansible URI, browser fetch, MATLAB, Node.js, R, PHP, Strest, Go, Dart, Java, JSON, Elixir, and Rust code (trillworks.com)

Convert curl command syntax to Python requests, Ansible URI, browser fetch, MATLAB, Node.js, R, PHP, Strest, Go, Dart, Java, JSON, Elixir, and Rust code
https://curl.trillworks.com/

 

 

 

 

 

右侧的代码部分复制出来,放到pycharm里,

可以看到是这样的。

 

 

 

 

header部分省略了。重要是参数部分。

注意到这里的实际请求网址应该是这样的,每一个参数都是组合成 & 和= 号组合起来的。基础网址是横线上的。

https://sd.zhiyuanyun.com/app/api/view.php?m=get_opps&type=2&id=91495669&p=16

所以打开这个网址,就可以得到实际请求的网页。是这样的,一个简单的表单网页。结构很简单。

 

 

 

 

地址栏是我们拼接的网址,?后面是请求的参数,每一个参数的名和值用=链接,中间用&链接。

那么就得到了。

这是请求过程。

接下来是保存数据的过程。

对于这种表单,我一直觉得麻烦, 所以直接就是保存成列表,放入字典。

以后用的时候再拆开。

请求得到结果如图

 

得到的response实际上就是一个表单组成的网页。用selector解析一下。

from scrapy.selector import Selector
import requests

headers = {*********************}

params = (
('m', 'get_opps'),
('type', '2'),
('id', '91495669'),
('p', '16'),
)


response = requests.get('https://sd.zhiyuanyun.com/app/api/view.php', headers=headers, params=params)


selector = Selector(response)
这时,我想要的就是表单里的信息,不想要表头,所以我用css选择器,选择从tr开始,tr里面,第一栏的tr是表头,所以不要表头,用

.table1 tr:nth-of-type(n+2)

这样的到下

tr = selector.css(".table1 tr:nth-of-type(n+2)")
for xi in tr:
a = xi.css('td a::text').extract_first()
href = xi.css('td a::attr(href)').extract_first()
print( a , href)
面的,然后再做一个遍历,就可以提取所有的项目名称和时间等信息。

这里我只想要的是 项目名和链接,打印出来可以看到,是这样的。

 

 

tr = selector.css(".table1 tr:nth-of-type(n+2)")
name_list = []
href_list = []
for xi in tr:
a = xi.css('td a::text').extract_first()
href = xi.css('td a::attr(href)').extract_first()
# print( a , href)
name_list.append(a)
href_list.append(href)

print(name_list, href_list)
dct_app = {}
dct_app.update(name = name_list, href = href_list)
dct_app
保存成字典,最后,就是把所有的组织都爬下来,这个是看愿意爬多少了。还有就是上面请求的参数部分,参数里的组织的链接是遗传字符,而请求组织的ID确实一串数字,这一串数字在每一个组织的名字前的方括号里,因此,这个信息也是必须的。

标签:请求,python,list,app,tr,爬取,href,post,com
From: https://www.cnblogs.com/chenwandong/p/16800649.html

相关文章

  • 关于post请求和get请求的一些常见问题
    1.post请求中和get请求中的请求参数都分别存在哪里?答:post方式的请求参数都存在它的实体内容中,get方式的请求参数存在于其url的后面2.post请求比get请求更安全吗?为什么?答......
  • 【http代理】Python-Selenium-Chrome(白名单使用)代码样例
    1.基于白名单方式使用Selenium+Chrome认证代理2.运行环境要求python2/3+selenium+Chrome+Chromedriver+Windows/Linux/macOS03.下载chromedriver(注意chromedrive......
  • 关于python的函数调用传递的参数前面的*
    调用(caller)func(*sequence)Passallobjectsinsequenceasindividualpositionalargumentsseq=[1,2,3]func(*seq)->func(1,2,3)func(**dict)Passallke......
  • 【http代理】Python2-requests代码样例
    1.基于requests的代码样例支持访问http,https网页,推荐使用2.requests不是python原生库,需要安装才能使用:pipinstallrequests#!/usr/bin/envpython#-*-coding:utf-......
  • python文件处理
    使用os模块,打开文件后去除后缀1defcsv2txt()2forfilenameinfilelist:3f=open("%s"%filename,"r")4dest_filename=os.path.splitext......
  • qgis连接postgis,将空间数据导出为shp格式
    之前遇到了一个需求,需要将postgis中GIS数据导出成shapefile文件参考:https://jackie-sun.blog.csdn.net/article/details/124140827?spm=1001.2014.3001.5502......
  • postman使用excel参数批量执行
    第一步,写好连接,报错。参数使用{{name}},这样的划分。保存接口 第二步,找到runner。选择接口所在的文件夹,点击runner   第三步,选择接口和文件  点击run,运行,......
  • python 异步任务框架 celery
    简介celery是一个分布式任务调度框架,由python编写。它专注于实时处理,在任务发布后,管理分配任务到不同的服务器,并取得结果。在执行任务分配时需要一个消息中间件(Broker),......
  • python的bug
    deffield_value_convert(data:List[dict])->List[dict]:#对列进行排序,并且对数据进行转换#分组项对应的列转换res:List[dict]=[]foriindata:......
  • @PostMapping和@GetMapping用法详解
    publicclassApplyObject{privateStringid;privateStringname;}1、使用post方法调用前端传递参数如果是一个object的话,如{id:'1',name:'2222'}后......