爬虫 python 爬取php的网页,带有post参数的网页如何爬取
記錄一下自己的爬蟲踩過的坑,上一次倒是寫了一些,但是寫得不夠清楚,這次,寫清楚爬取的過程。
這個(gè)網(wǎng)站是某省的志愿服務(wù)網(wǎng)。
?
?
?就是它了。
我向爬取一些組織開展過的活動(dòng),比如這一個(gè)組織,
這個(gè)組織的頁(yè)面找打它不存在什么問題,組織的網(wǎng)址只需要拼接就可以了。
看似很容易。
基礎(chǔ)網(wǎng)址是:https://sd.zhiyuanyun.com/app/org/view.php?id=(*****)
前面是一堆,后面只需要把id后面的組織的ID放進(jìn)去就可以,組織的ID也很好找。就是直接從首頁(yè)一頁(yè)頁(yè)爬也行。這個(gè)網(wǎng)站的首頁(yè)也不復(fù)雜。
但是現(xiàn)在我要得到這個(gè)組織開展的活動(dòng)列表。
比如這個(gè)組織。
?這個(gè)組織開展的活動(dòng)蠻多的,看出來會(huì)有16頁(yè),最下面有標(biāo)簽,16.
難點(diǎn)是我怎么能知道最后一個(gè)頁(yè)是16,就是最大的數(shù), 有的組織只有1頁(yè),有的7,有的8.我得知道這個(gè)最末頁(yè)的數(shù),才能寫一個(gè)循環(huán)。不能直接寫一個(gè)while true 來一個(gè)break吧。
這時(shí)候,就需要研究一下這個(gè)網(wǎng)頁(yè)的請(qǐng)求方式了。
這個(gè)網(wǎng)頁(yè)請(qǐng)求使用的是post,而不是get。如果是get, 那么只能得到的頁(yè)面是。
?是這樣一個(gè)頁(yè)面,get請(qǐng)求的網(wǎng)址也是沒錯(cuò)的。
https://sd.zhiyuanyun.com/app/org/view.php?id=TF86AlHTUWfd6
但是發(fā)起的項(xiàng)目這個(gè)部分,是看不到的。再仔細(xì)研究看看。其實(shí)在請(qǐng)求過程中,還有一個(gè)js請(qǐng)求。
剛開始我以為是xhr,即ajax,找了半天也沒找到。
?清空一下網(wǎng)絡(luò)請(qǐng)求信息,點(diǎn)一下某一頁(yè)的項(xiàng)目。就會(huì)看到一個(gè)post請(qǐng)求的
?這個(gè)post請(qǐng)求,復(fù)制出來,注意是復(fù)制curl (bash)
?把這個(gè)貼進(jìn)去 生成請(qǐng)求的網(wǎng)頁(yè),就可以得到python的請(qǐng)求代碼。
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/?
?
?
右側(cè)的代碼部分復(fù)制出來,放到pycharm里,
可以看到是這樣的。
?header部分省略了。重要是參數(shù)部分。
注意到這里的實(shí)際請(qǐng)求網(wǎng)址應(yīng)該是這樣的,每一個(gè)參數(shù)都是組合成 & 和= 號(hào)組合起來的?;A(chǔ)網(wǎng)址是橫線上的。
https://sd.zhiyuanyun.com/app/api/view.php?m=get_opps&type=2&id=91495669&p=16
所以打開這個(gè)網(wǎng)址,就可以得到實(shí)際請(qǐng)求的網(wǎng)頁(yè)。是這樣的,一個(gè)簡(jiǎn)單的表單網(wǎng)頁(yè)。結(jié)構(gòu)很簡(jiǎn)單。
?地址欄是我們拼接的網(wǎng)址,?后面是請(qǐng)求的參數(shù),每一個(gè)參數(shù)的名和值用=鏈接,中間用&鏈接。
那么就得到了。
這是請(qǐng)求過程。
接下來是保存數(shù)據(jù)的過程。
對(duì)于這種表單,我一直覺得麻煩, 所以直接就是保存成列表,放入字典。
以后用的時(shí)候再拆開。
請(qǐng)求得到結(jié)果如圖
?得到的response實(shí)際上就是一個(gè)表單組成的網(wǎng)頁(yè)。用selector解析一下。
from scrapy.selector import Selector import requestsheaders = {*********************}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)這時(shí),我想要的就是表單里的信息,不想要表頭,所以我用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)面的,然后再做一個(gè)遍歷,就可以提取所有的項(xiàng)目名稱和時(shí)間等信息。
這里我只想要的是 項(xiàng)目名和鏈接,打印出來可以看到,是這樣的。
?
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?保存成字典,最后,就是把所有的組織都爬下來,這個(gè)是看愿意爬多少了。還有就是上面請(qǐng)求的參數(shù)部分,參數(shù)里的組織的鏈接是遺傳字符,而請(qǐng)求組織的ID確實(shí)一串?dāng)?shù)字,這一串?dāng)?shù)字在每一個(gè)組織的名字前的方括號(hào)里,因此,這個(gè)信息也是必須的。
總結(jié)
以上是生活随笔為你收集整理的爬虫 python 爬取php的网页,带有post参数的网页如何爬取的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记录一下pandas的分组统计功能,ag
- 下一篇: 利用python进行统计分析的一些笔记(