我正在努力改进我对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对我来说不起作用,尽管我没有尝试所有内容,并且有很多可能性。
答案 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。