从Python运行Stack Overflow查询

时间:2014-02-22 22:02:22

标签: python urllib2

我正在努力改进我对a question on Meta Stack Overflow的回答。我想在某个Stack Exchange站点上运行搜索并检测我是否得到任何结果。例如,我可能会运行this query。当我通过浏览器运行查询时,我看不到html中的字符串“你的搜索没有返回匹配”。但是当我运行这个Python代码时:

"Your search returned no matches" in urllib2.urlopen("https://math.stackexchange.com/search?q=user%3Ame+hasaccepted%3Ano+answers%3A1+lastactive%3A2013-12-24..2014-02-22+").read()

我得到True,实际上该字符串包含的页面与我在浏览器中显示的页面明显不同。如何以一种方式运行搜索,以便以正常,人性化的方式(从浏览器)运行查询时获得相同的结果?

更新:正如@ ThiefMaster♦所建议的那样,requests完成了同样的事情。不幸的是,它得到了相同的结果。

"Your search returned no matches" in requests.get("https://math.stackexchange.com/search?q=user%3Ame+hasaccepted%3Ano+answers%3A1+lastactive%3A2013-12-24..2014-02-22").text

我使用FireBug查看从浏览器运行搜索时运行的GET标头。这是:

GET /search?q=user%3A128043+hasaccepted%3Ano+answers%3A1+lastactive%3A2013-12-24..2014-02-22 HTTP/1.1
Host: math.stackexchange.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:27.0) Gecko/20100101 Firefox/27.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: https://math.stackexchange.com/search?q=user%3A128043+hasaccepted%3Ano+answers%3A1+lastactive%3A2013-12-24..2014-02-22
Cookie: __qca=P0-1687127815-1387065859894; __utma=27693923.779260871.1387065860.1393095534.1393101885.19; __utmz=27693923.1393095534.18.10.utmcsr=stackoverflow.com|utmccn=(referral)|utmcmd=referral|utmcct=/users/2829764/kuzzooroo; _ga=GA1.2.779260871.1387065860; mathuser=t=WM42SFDA5Uqr&s=OsFGcrXrl06g; sgt=id=bedc99bd-5dc9-42c7-85db-73cc80c4cc15; __utmc=27693923
Connection: keep-alive

使用此标题的各个部分运行requests.get对我来说不起作用,尽管我没有尝试所有内容,并且有很多可能性。

1 个答案:

答案 0 :(得分:0)

某些网站根据哪个客户端连接到它们会产生不同的结果。我不知道stackoverflow是否就是这种情况。但是我用wiki认出了它。

以下是我假装自己是Opera浏览器的方法:

def openAsOpera(url):
    u = urllib.URLopener()
    u.addheaders = []
    u.addheader('User-Agent', 'Opera/9.80 (Windows NT 6.1; WOW64; U; de) Presto/2.10.289 Version/12.01')
    u.addheader('Accept-Language', 'de-DE,de;q=0.9,en;q=0.8')
    u.addheader('Accept', 'text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1')
    f = u.open(url)
    content = f.read()
    f.close()
    return content

当然,你可以通过调整来假装客户端是Firefox。