如何用bs4和urllib实现含Token的搜索查询?登录失败问题求助
搞定你的登录问题!
嘿,我瞅了下你的代码,几个关键问题导致登录失败,咱们一步步来修正:
你的代码为啥行不通?
- 直接POST到页面URL,找错了接收数据的接口:大部分网站的登录表单,真正处理提交请求的是表单
action属性指向的地址,不是当前页面的URL。你直接给index.html发POST,服务器根本不处理登录请求。 - 没管会话Cookie:登录是需要保持会话的,
urllib.urlopen默认不会保存和携带Cookie,相当于每次请求都是新用户,自然登不上。 - 可能漏了隐藏字段:就算没找到CSRF Token,有些网站会藏着其他必填的隐藏参数,得从登录页面里扒出来一起提交。
修正后的完整步骤&代码
先给你改好的代码,后面再给你拆解关键点:
import bs4 as bs from urllib import request, parse from http.cookiejar import CookieJar # 第一步:初始化Cookie管理器,用来保存登录会话的Cookie cj = CookieJar() opener = request.build_opener(request.HTTPCookieProcessor(cj)) request.install_opener(opener) # 先访问登录页面,拿到Cookie和表单的关键信息 login_page_url = 'http://site24.way2sms.com/content/index.html' response = opener.open(login_page_url) soup = bs.BeautifulSoup(response.read(), "lxml") # 找到登录表单(你得根据实际页面的HTML调整这里的定位,比如表单的id/class) login_form = soup.find('form', attrs={'id': 'loginForm'}) # 获取表单的提交地址,要是是相对路径就拼成完整URL form_action = login_form.get('action') if not form_action.startswith('http'): form_action = parse.urljoin(login_page_url, form_action) # 提取表单里所有隐藏字段(包括可能的CSRF Token),这些都是必填的 post_data = {} for input_tag in login_form.find_all('input', type='hidden'): post_data[input_tag.get('name')] = input_tag.get('value') # 加上你的用户名和密码 post_data['username'] = '1234567890' post_data['password'] = 'mypassw' # 编码数据,提交到正确的登录接口 encoded_data = parse.urlencode(post_data).encode('utf-8') login_response = opener.open(form_action, encoded_data) # 验证登录是否成功:比如看页面里有没有登录后的标识(比如用户名显示) soup_after_login = bs.BeautifulSoup(login_response.read(), "lxml") if soup_after_login.find('span', class_='user-name'): # 这里也要根据实际页面调整 print("登录成功啦!") else: print("登录失败,检查下用户名密码,或者表单字段有没有找对") # 登录成功后,就可以带着Cookie搞后续的搜索操作了 # 比如访问搜索页面,找到搜索表单,填充关键词后提交 # search_page = opener.open('你的搜索页面URL') # search_soup = bs.BeautifulSoup(search_page.read(), "lxml") # search_form = search_soup.find('form', id='searchForm') # 同样提取隐藏字段,加上搜索关键词,POST到表单的action地址
几个必须注意的细节
- 表单定位要准确:你得打开登录页面的源码,看看表单的
id或者class,还有用户名/密码输入框的name属性(POST数据是按name传的,不是id!)。 - Cookie必须管:用
CookieJar是保持会话的关键,不然登录状态根本存不住。 - 隐藏字段别漏:上面的代码自动提取了所有隐藏input,就算有CSRF Token也会被自动加进去,不用手动找了。
内容的提问来源于stack exchange,提问作者DARK_C0D3R
相关产品推荐
相关产品推荐

