Python3 模拟登录并爬取表格数据

博客主要内容有:

  • 通过requests库模拟表单提交
  • 通过pandas库提取 页表格

题目要求:把一个 页上所有年所有县所有作物的数据全爬下来,存到Access里

目标分析

给到的 址是这个:https://www.ctic.org/crmdsourcetag=s_pctim_aiomsg

打开长这样:

那个大表格的数据就是目标数据了,好像没什么了不起的——

有点不对劲

目标数据所在 页的 址是这样的:https://www.ctic.org/crm/ction=result ,刚刚选择的那些参数并没有作为url的参数啊! 址 页都变了,所以也不是ajax

这和想象的情况有巨大差别

尝试获取目标页面

点击这个按钮时到底发生了:右键检查是这样:

不管了,一下试试看

import requests

url = ‘https://www.ctic.org/crmdsourcetag=s_pctim_aiomsg’
headers = {‘user-agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) ’
‘AppleWebKit/537.36 (KHTML, like Gecko) ’
‘Chrome/74.0.3729.131 Safari/537.36’,
‘Host’: ‘www.ctic.org’}
data = {’_csrf’: ‘SjFKLWxVVkkaSRBYQWYYCA1TMG8iYR8ReUYcSj04Jh4EBzIdBGwmLw==’,
‘CRMSearchForm[year]’: ‘2011’,
‘CRMSearchForm[format]’: ‘Acres’,
‘CRMSearchForm[area]’: ‘County’,
‘CRMSearchForm[region]’: ‘Midwest’,
‘CRMSearchForm[state]’: ‘IL’,
‘CRMSearchForm[county]’: ‘Adams’,
‘CRMSearchForm[crop_type]’: ‘All’,
‘summary’: ‘county’}
response = requests.post(url, data=data, headers=headers)
print(response.status_code)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import requests   url = ‘https://www.ctic.org/crmdsourcetag=s_pctim_aiomsg’ headers = { ‘user-agent’ : ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) ’            ‘AppleWebKit/537.36 (KHTML, like Gecko) ’            ‘Chrome/74.0.3729.131 Safari/537.36’ ,            ‘Host’ : ‘www.ctic.org’ } data = { ’_csrf’ : ‘SjFKLWxVVkkaSRBYQWYYCA1TMG8iYR8ReUYcSj04Jh4EBzIdBGwmLw==’ ,          ‘CRMSearchForm[year]’ : ‘2011’ ,          ‘CRMSearchForm[format]’ : ‘Acres’ ,          ‘CRMSearchForm[area]’ : ‘County’ ,          ‘CRMSearchForm[region]’ : ‘Midwest’ ,          ‘CRMSearchForm[state]’ : ‘IL’ ,          ‘CRMSearchForm[county]’ : ‘Adams’ ,          ‘CRMSearchForm[crop_type]’ : ‘All’ ,          ‘summary’ : ‘county’ } response = requests . post ( url , data = data , headers = headers ) print ( response . status_code )

果不其然,输出……我猜这就是传说中的在搞鬼Python3 络爬虫实战》只看一点点的我不禁有些心虚跃跃欲试呢!

首先,搞不清具体是啥,只知道它是用来维持会话的,应该来自于第一次,搞出来看看先:

response1 = requests.get(url, headers=headers)
if response1.status_code == 200:
cookies = response1.cookies
print(cookies)

1 2 3 4 response1 = requests . get ( url , headers = headers ) if response1 . status_code == 200 :      cookies = response1 . cookies      print ( cookies )

输出:

, ]>

1 RequestsCookieJar [ Cookie PHPSESSID = 52asgghnqsntitqd7c8dqesgh6 for www . ctic . org / > , Cookie _csrf = 2571c72a4ca9699915ea4037b967827150715252de98ea2173b162fa376bad33s % 3A32 % 3A % 22TAhjwgNo5ElZzV55k3DMeFoc5TWrEmXj % 22 % 3B for www . ctic . org / > ] >

Nah,看不懂,不看不管,直接把它放到里试试

response2 = requests.post(url, data=data, headers=headers, cookies=cookies)
print(response2.status_code)

1 2 response2 = requests . post ( url , data = data , headers = headers , cookies = cookies ) print ( response2 . status_code )

还是,气氛突然有些焦灼,我给了啊,还想要啥

突然,发现一件事:请求所带的中那个一开始就显得很可疑的仿佛在哪儿见过/p>

那个完全看不懂的里好像就有一个啊!但是两个的值很明显结构不一样,试了一下把里的换成里的确实也不行。

但是逐渐有了一个想法:这个两个虽然不相等,但是应该是匹配的,我刚刚的来自浏览器,来自python程序,所以不匹配!

于是又点开浏览器的DevTools,Ctrl+F搜索了一下,嘿嘿,发现了:

第一处那里的下一行的很明显就是请求所带的里的,另外两个是js里的函数,虽然js没好好学但也能看出来这俩是通过请求获得州名和县名的,Binggo!一下子解决两个问题。

为了验证我的猜想,我打算先直接用requests获取点击前的页面的HTML和,将从HTML中提取的值作为点击时请求的里的值,同时附上,这样两处就应该是匹配的了:

										
上一篇 2019年6月16日
下一篇 2019年6月16日

相关推荐