Python,PHP模拟浏览器发送HTTP请求

最近研究微博,想取自己的微薄RSS订阅Feed,但在国内(包括sina微博),都不提供个人微博的RSS。要取得自己的微博内容便于站外展示,只有通过官方发布的挂件 (sina , QQ)

    • sina取个人RSS的方案可以参考:月光博客。原理是抓取sina的挂件,然后解析HTML 获得。

    • 腾讯微薄就比较麻烦了,虽然他也有挂件,蛋,如果直接抓iframe的地址发现不行。查看挂件HTTP请求,发现最后会请求一个地址,如下:

      http://v.t.qq.com/cgi-bin/weiboshow?f=p&tweetflag=1&fansflag=0&fansnum=0&
      name=bbayou&sign=7bf0ab71321a3f376b710d2c739a2a8788ee1b0f

      然后返回一个json数据,腾讯服务器会有refer验证,也就是说只支持rerfer地址为 v.t.qq.com 的HTTP请求,直接访问会报错。所以,我们可以通过自定义 header refer,来访问接口。

      这里需要注意的是,参数:name (腾讯围脖用户名) , sign (腾讯围脖sign码,是唯一的)

取腾讯微博RSS,python代码如下,GET

qqurl = "/cgi-bin/weiboshow?f=p&tweetflag=1&fansflag=0&fansnum=0&name=bbayou&sign=7bf0ab71321a3f376b710d2c739a2a8788ee1b0f";
import httplib
headers = {"Cache-Control": "no-cache","Referer":"http://v.t.qq.com/"}
conn = httplib.HTTPConnection("v.t.qq.com")
conn.request("GET", qqurl, '', headers)
response = conn.getresponse()
print response.status, response.read()
conn.close();

如果腾讯需要POST,如下,注意,POST的时候,尽量把header信息填全,不然有时会通不过服务器验证

import httplib,urllib; 
params = urllib.urlencode({'cnum':'20','ctype':'CN02','isform':'true'})
headers = {"Content-Type":"application/x-www-form-urlencoded","Referer":"http://v.t.qq.com/"};
conn = httplib.HTTPConnection("v.t.qq.com")
conn.request(method="POST",url="/cgi-bin/weiboshow",body=params,headers=headers)
response = conn.getresponse()
print response.status, response.read()
conn.close()

因为在wordpress上使用,不支持python,写了个PHP,这里用Curl比较靠谱一点,fsockopen不太稳定

<?php
class QQClass
{
	var $Server = 'v.t.qq.com';
	var $Host = 'localhost';
	var $header = '';  
	var $Get_QQpath;
	var $Referer = 'http://v.t.qq.com/';
	var $Content = '';	
	var $Fp = '';
	function __construct($url){
		$this->Get_QQpath = $url;
		$this->Fp = fsockopen($this->Server,80, $errno, $errstr, 30);
		if (!$this->Fp){
			echo "ERROR: ".$errno." - ".$errstr."<br />\n";
			exit;
		}
		$out = "GET ".$this->Get_QQpath." HTTP/1.0\r\n";
		$out .= "Host: ".$this->Host." \r\n";
		$out .= "Referer: ".$this->Referer."\r\n";
		$out .= "Connection: Close\r\n\r\n";
		$out .=	"Accept-Language	zh-cn,zh;q=0.5";
		$out .=	"Cache-Control	no-cache";
		$out .=	"User-Agent	Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19 GTB7.1";
		$this->header = $out;
	}
	function Get_json(){
		if(function_exists('curl_init')){	
			$curl = curl_init();    
			curl_setopt($curl, CURLOPT_URL, $this->Get_QQpath);
			curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $this->header);    
			curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);     
			$this->Content = curl_exec($curl);        
			curl_close($curl);  
		}else{	
			fwrite($this->Fp, $this->header);
			while (!feof($this->Fp))
			{
				$this->Content .= fgets($this->Fp, 128);
			}
			fclose($this->Fp);
		}
		preg_match("/Content-Length:.?(\d+)/", $this->Content, $matches);
		$length = $matches[1];
		$this->Content = substr($this->Content, - $length);
		return $this->Content;
	}
}
?>

然后,调用接口,最后解析Json就行了

<?php
require_once('QQClass.class.php');
$url = 'http://v.t.qq.com/cgi-bin/weiboshow?f=p&tweetflag=1&fansflag=0&fansnum=0&name=bbayou&sign=7bf0ab71321a3f376b710d2c739a2a8788ee1b0f';
$QQ = new QQClass($url);
$QQdata = $QQ->Get_json();
//ToDo json_decode();
?>
posted on 2011-09-05 05:30  之乎者也2011 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/wrmfw/archive/2011/09/05/2166939.html

### 回答1: 以下是Python模拟微博登录的示例代码: ```python import requests from bs4 import BeautifulSoup # 构造请求头部 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} # 登录页面URL login_url = 'https://passport.weibo.cn/signin/login' # 构造登录请求表单数据 data = { 'username': 'your_username', # 替换为你的微博账号 'password': 'your_password', # 替换为你的微博密码 'savestate': '1', 'r': '', 'ec': '0', 'pagerefer': 'https://passport.weibo.cn/signin/welcome?entry=mweibo&r=https%3A%2F%2Fm.weibo.cn%2F', 'entry': 'mweibo' } # 发送登录请求 session = requests.session() response = session.post(login_url, headers=headers, data=data) # 获取登录后的首页内容 home_url = 'https://m.weibo.cn/' response = session.get(home_url, headers=headers) soup = BeautifulSoup(response.content, 'html.parser') print(soup) ``` 请注意,微博登录需要输入验证码,上述示例代码并未处理验证码。如果出现验证码,需要手动输入或者使用第三方库进行识别。此外,微博登录也可能需要进行短信验证等额外步骤。 ### 回答2: Python可以使用Selenium库来模拟微博登录。 Selenium是一个自动化测试工具,可以模拟用户在浏览器中的操作。首先,我们需要安装Selenium库和一个浏览器驱动,比如ChromeDriver。 接下来,我们可以使用以下代码来模拟微博登录: ```python from selenium import webdriver from selenium.webdriver.common.keys import Keys import time # 创建一个Chrome浏览器的实例 driver = webdriver.Chrome() # 打开微博登录页面 driver.get("https://weibo.com/login.php") # 定位到用户名和密码的输入框,并输入相应的值 username_input = driver.find_element_by_name("username") username_input.send_keys("your_username") password_input = driver.find_element_by_name("password") password_input.send_keys("your_password") # 提交登录信息 password_input.send_keys(Keys.ENTER) # 等待登录成功并跳转到首页 time.sleep(5) # 打印登录成功后的页面标题 print(driver.title) # 关闭浏览器 driver.quit() ``` 上述代码首先创建一个Chrome浏览器实例,然后打开微博登录页面。接着,通过`find_element_by_name`方法定位到用户名和密码的输入框,并使用`send_keys`方法输入相应的值。 然后,通过`send_keys(Keys.ENTER)`方法提交登录信息。登录成功后,等待5秒钟,然后打印登录成功后的页面标题。 最后,关闭浏览器。 通过这样的方式,我们可以使用Python模拟微博登录,实现自动化登录功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值