python如何获取百度搜索结果的真实URL
来源:互联网 发布:好运来返奖统计软件 编辑:程序博客网 时间:2024/06/11 16:26
在公司中需要去抓取一些数据,就遇到了以下这些问题:
想通过爬虫获取百度搜索结果的原始链接。通过Firefox的HttpFox插件,发现在搜索结果的URL是加密过的,例如:
http://www.baidu.com/link?url=w0Kz2y9t3Ne9YtTTkZ1M_ToY43HWy3tia4djxC8u9CC点击链接之后,会向该链接发送GET,从服务器得到的回复中包含真实URL:http://www.python.org
想通过python爬虫模拟这个过程:
获取关键字,构造百度搜索URL(借助Firefox自带的百度搜索,构建简化的搜索链接)
通过pyquery获取页面中所有的搜索结果URL:
[(site.attr('href'), site.text().encode('utf-8')) for site in self.page('div.result.c-container h3.t a').items()]
//不知道这个items()方法在这里用的对不对向加密后的URL发起GET请求,试图获得HttpFox中获取到的content
提取真实URL,进行显示
目前可以获取到页面加密后的URL(但是针对相同的一个网址每次获取的加密后URL都不同,可以理解),但是第3步获取到的页面,不是httpfox中的那个页面,而是很复杂的页面(应该是跳转之后到页面)。
尝试了requests.get()中设定参数allow_redirects=False,但是获取的回复也不是httpfox的那个content。
#!/usr/bin/python#coding=utf-8import reimport requestsfrom pyquery import PyQuery as Pqclass BaiduSearchSpider(object): def __init__(self, searchText): self.url = "http://www.baidu.com/baidu?wd=%s&tn=monline_4_dg" % searchText self.headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/600.5.17 (KHTML, like Gecko) Version/8.0.5 Safari/600.5.17"} self._page = None @property def page(self): if not self._page: r = requests.get(self.url, headers=self.headers) r.encoding = 'utf-8' self._page = Pq(r.text) return self._page @property def baiduURLs(self): return [(site.attr('href'), site.text().encode('utf-8')) for site in self.page('div.result.c-container h3.t a').items()] @property def originalURLs(self): tmpURLs = self.baiduURLs print tmpURLs originalURLs = [] for tmpurl in tmpURLs: tmpPage = requests.get(tmpurl[0]) #tmpPage.encoding = 'utf-8' #这样不好使,print的时候python报错 tmptext = tmpPage.text.encode('utf-8') urlMatch = re.search(r'URL=\'(.*?)\'', tmptext, re.S) if not urlMatch == None: print urlMatch.group(1), " ", tmpurl[1] originalURLs.append(tmpurl) else: print "---------------" print "No Original URL found!!" print tmpurl[0] print tmpurl[1] return originalURLssearchText = raw_input("搜索内容是:") print searchTextbdsearch = BaiduSearchSpider(searchText) originalurls = bdsearch.originalURLsprint '=======Original URLs========'print originalurlsprint '============================'通过pyquery的history属性,发现baidu这些连接大多进行了redirect(http 302),但是有一部分链接是直接获得了http200回复。对于从百度爬取的加密的url,进行requests.get()时不允许跳转(allow_redirects=False)。然后针对这两类服务器回复分别处理:
http 302跳转:从headers中的'location'可以获得原始url;
http 200回复:从content中通过正则表达式获取原始url
对上述代码中的def originalURLs(self)函数进行修改:
for tmpurl in tmpURLs: tmpPage = requests.get(tmpurl[0], allow_redirects=False) if tmpPage.status_code == 200: urlMatch = re.search(r'URL=\'(.*?)\'', tmpPage.text.encode('utf-8'), re.S) originalURLs.append((urlMatch.group(1), tmpurl[1])) elif tmpPage.status_code == 302: originalURLs.append((tmpPage.headers.get('location'), tmpurl[1])) else: print 'No URL found!!'抓了几页,发现绝大部分url是通过302跳转的。不知道为什么httpfox上会看到好多是200OK状态的。
0 0
- python如何获取百度搜索结果的真实URL
- 百度搜索结果中link?url 格式的真实地址获取方式
- C++和python如何获取百度搜索结果页面下信息对应的真实链接(百度搜索爬虫,可指定页数)
- 使用htmlunit 获取百度新闻搜索结果的url
- java获取百度的真实url
- python之除法获取真实的结果
- 百度搜索结果URL解密
- python爬虫(11)身边的搜索专家——获取百度搜索结果
- Python抓取百度图片搜索的结果
- python抓取百度搜索结果
- python 爬虫百度搜索结果
- 百度搜索结果页url参数详解
- python 重定向获取真实url
- Python 获取Twitter搜索结果
- 如何抓取谷歌,百度里面特定的搜索结果
- 如何快速从百度获取真实流量
- 百度搜索结果的调整
- 使用python解析百度搜索结果
- 源码分析:ConcurrentHashMap实现分析
- Android 开发中的KotLin
- 不可错过的iOS开发技巧
- Android Studio 设置背景图片
- phpMyAdmin 出现 ---- 缺少 mysqli 扩展,请检查 PHP 配置。
- python如何获取百度搜索结果的真实URL
- 开发APP接口,PHP在Apache下一直返回500错误的原因
- String、StringBuilder、StringBuffer和CharSequence的区别
- 基于SpringMVC下的Rest服务框架搭建【1、集成Swagger】
- 安卓开发接入微信支付功能的详细步骤(手把手教你一步一步接入,适合小白)
- 当压测遇见奥运 ——游戏服务器如何在上线时面对用户的洪荒之力
- selenium 2.0 'NoneType' object has no attribute 'send_keys'
- AndroidStudio在gradle文件中修改debug签名为正式签名
- IT-linux-top系列--top静态使用