我想从论坛页面获取带有请求和BeautifulSoup模块的数据。
这是我的代码:
import requests
from bs4 import BeautifulSoup
src = requests.get("http://forum.bazicenter.com/members/59765/").text
soup = BeautifulSoup(src)
for link in soup.findAll('a', {'class': 'im_txt_link'}):
mail = link.string
print(mail)
问题是需要首先登录访问此页面。
有没有办法做到这一点?
答案 0 :(得分:2)
是。使用requests.Session()
import requests
from bs4 import BeautifulSoup
s = requests.Session()
login_data = {'email':'me@example.com', 'password':'pw'}
s.post("http://forum.bazicenter.com/login", login_data)
result = s.get("http://forum.bazicenter.com/members/59765/").text
soup = BeautifulSoup(result)
请注意,您可能会被迫提供csrf
令牌,您可以先通过向登录表单发送get
请求来获取该令牌,然后您可以抓取该令牌以按顺序检索令牌将其包含在login_data
词典中。
通过登录表单进行猜测,您可以使用这些参数:
login_url = "http://forum.bazicenter.com/login.php?do=login"
login_data = {
'vb_login_password_hint': 'your_password',
'vb_login_username': 'username'
}
s.post(login_url, login_data)
...但是它会变得棘手,因为该网站使用了md5
的奇怪和奇怪的方式 - 用JavaScript将密码哈希放入隐藏的密码字段中表格,发布之前。
如果不提供盐,您可以在发布之前尝试md5
来自Python的密码。但是,你必须更精确地研究它是如何完成的。
答案 1 :(得分:1)
扩展上面提到的Jivan
,你需要知道在发出请求时要发送的其他参数。一种简单的方法是打开浏览器并将请求代理给您自己以查看登录表单的工作方式。
首先,这是使用firefox,进入选项,然后转到高级选项卡,然后选择网络。从网络点击设置,然后检查手动单选按钮。
现在我们可以指定发送请求的位置。将HTTP Proxy
设置为127.0.0.1
,将端口设置为8080
。
在应用此设置之前,请确保底部的No Proxy
字段为空。也就是说,不限制localhost
或127.0.0.1
。
现在,当您提出请求时,您将收到错误页面。这是因为发送给您的请求不是网站,也没有生成响应。
这是一个python脚本,它将为您打印请求。确保在发出请求之前运行此脚本。参数位于该行与较大的文本正文之间有一个空格的行,即header
。
import socket
s = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
s.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 ) # Needed to reuse the script after closing, due to network reasons
s.bind(( '127.0.0.1', 8080 ))
s.listen( 1 )
while True:
client, client_addr = s.accept()
data = client.recv(4069)
print data
client.close()
s.close()