python爬虫(11)身边的搜索专家——获取百度搜索结果
2017-05-04 19:07
911 查看
使用python来抓取百度搜索的内容
思路:
1.进入百度首页,获取百度首页页面内容
2.通过正则,或者其他方式定位到搜索框输入栏,输入将要搜索的内容
3.获取搜索页面
4.通过正则表达式或者其他形式, 获取搜索界面的搜索条目
5.过滤出想要得到的内容
第1种方式
从百度首页入手,通过webdriver+selenium, 定位搜索栏,输入搜索内容,获取搜索内容
以这种方式,可以灵活的搜索获取任何想要搜索的内容
第2种方式:
直接利用搜索内容的url地址, 来获取搜索的内容
同样的使用webdriver+selenium来定位搜索结果
这种方式比较繁琐, 必须知道最后包含搜索内容的url地址
以上两种方式,有个缺点, 就是使用webdriver+selenium的方式, 搜索效率比较慢
毕竟python本身运行速度不是很快,再加上webdriver+selenium速度就更降一点
第三种方式
使用正则,urllib2的方式
思路和第一种类似
PS:第三种方法来源网上,未经验证,主要提供一个思路
思路:
1.进入百度首页,获取百度首页页面内容
2.通过正则,或者其他方式定位到搜索框输入栏,输入将要搜索的内容
3.获取搜索页面
4.通过正则表达式或者其他形式, 获取搜索界面的搜索条目
5.过滤出想要得到的内容
第1种方式
从百度首页入手,通过webdriver+selenium, 定位搜索栏,输入搜索内容,获取搜索内容
以这种方式,可以灵活的搜索获取任何想要搜索的内容
#coding:utf-8 import sys import time from selenium import webdriver from selenium.webdriver.common.keys import Keys reload(sys) sys.setdefaultencoding('utf-8') def get_search_content_title(): browser = webdriver.PhantomJS() browser.get('http://www.baidu.com') assert "百度" in browser.title search_text_blank = browser.find_element_by_id("kw") search_text_blank.send_keys(u"14_python爬虫") search_text_blank.send_keys(Keys.RETURN) time.sleep(3) #print browser.page_source assert 'python爬虫——爬出新高度' in browser.page_source element_List=browser.find_elements_by_xpath(".//*/h3/a") itemNum=len(element_List) print 'length is :'+str(itemNum) for a in element_List: tmptitle= a.text if 'python爬虫——爬出新高度' in tmptitle: print a.get_attribute('href') tmpurl= a.get_attribute('href') #a.click() browser.get(tmpurl) print 'I got it' break print browser.current_url print 'end' browser.close() if __name__ == '__main__': print ''' ***************************************** ** Welcome to Spider of baidu search ** ** Created on 2017-05-203 ** ** @author: Jimy _Fengqi ** ***************************************** ''' get_search_content_title()
第2种方式:
直接利用搜索内容的url地址, 来获取搜索的内容
同样的使用webdriver+selenium来定位搜索结果
这种方式比较繁琐, 必须知道最后包含搜索内容的url地址
#coding:utf-8 import sys import time from selenium import webdriver reload(sys) sys.setdefaultencoding('utf-8') def get_page(): browser = webdriver.PhantomJS() browser.get('https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=14_python%E7%88%AC%E8%99%AB&rsv_pq=d8558269000125d9&rsv_t=a6bbVwQQcUiVsCkVCbxoCfHKFzCvgBMrSicjwE1ysi3o5%2BxoNDlcXgt7R3k&rqlang=cn&rsv_enter=1&rsv_sug3=11&inputT=88&rsv_sug4=88') time.sleep(3) eleList=browser.find_elements_by_xpath(".//*/h3/a") itemNum=len(eleList) print 'length is :'+str(itemNum) for a in eleList: tmptitle= a.text if 'python爬虫——爬出新高度' in tmptitle: print a.get_attribute('href') tmpurl= a.get_attribute('href') #a.click() browser.get(tmpurl) print 'I got it' break print browser.current_url print 'end' browser.close() if __name__ == '__main__': print ''' ***************************************** ** Welcome to Spider of baidu search ** ** Created on 2017-05-203 ** ** @author: Jimy _Fengqi ** ***************************************** ''' get_page()
以上两种方式,有个缺点, 就是使用webdriver+selenium的方式, 搜索效率比较慢
毕竟python本身运行速度不是很快,再加上webdriver+selenium速度就更降一点
第三种方式
使用正则,urllib2的方式
思路和第一种类似
PS:第三种方法来源网上,未经验证,主要提供一个思路
# coding=utf-8 import urllib2 import string import urllib import re def my_urlencode(str): reprStr = repr(str).replace(r'\x','%') return reprStr[1:-1] def clearTag(text): p = re.compile(u'<[^>]+>') retval = p.sub("",text) return retval def get_res_list_and_next_page_url(target_url): res = urllib2.urlopen(target_url) html=res.read() content = unicode(html, 'utf-8','ignore') #获取res_list pattern = re.compile(r'<table.*?class="result".*?>[\s\S]*?</table>')#大部分情况 resList_1 = pattern.findall(html) pattern = re.compile(r'<div class="result-op c-container.*?>[\s\S]*?</div>.*?</div>')#少数情况 resList_2 = pattern.findall(html) res_lists = resList_1 + resList_2 #合并搜索结果 #获取next_page_url pattern = re.compile(r'<p id="page".*?>[\s\S]*</p>') m = pattern.search(html) next_page_url = '' if m: t = m.group() pattern = re.compile(r'<a href=".*?"') mm = pattern.findall(t) tt = mm[len(mm)-1] tt = tt[9:len(tt)-1] next_page_url = 'http://www.baidu.com'+tt return res_lists,next_page_url def get_title(div_data): pattern = re.compile(r'<a[\s\S]*?>.*?<em>.*?</em>') m = pattern.search(div_data) if m: title = clearTag(m.group(0).decode('utf-8').encode('gb18030')) pattern = re.compile(r'</em>.*?</a>') #加?号是最小匹配 m=pattern.search(div_data) if m: title += clearTag(m.group(0).decode('utf-8').encode('gb18030')) return title.strip() def get_url(div_data): pattern = re.compile(r'mu="[\s\S]*?"') m = pattern.search(div_data) if m: #mu模式 url = m.group(0) url = url.replace("mu=","") url = url.replace(r'"''"',"") else: #href模式 pattern = re.compile(r'href="[\s\S]*?"') mm = pattern.search(div_data) if mm: url = mm.group(0) url = url.replace("href=","") url = url.replace(r'"',"") return url def get_abstract(div_data): pattern = re.compile(r'<div class="c-abstract">[\s\S]*?</div>') m = pattern.search(div_data) if m: #普通模式 abstract=clearTag(m.group(0)) else: #奇怪模式1,貌似是外国网站 pattern = re.compile(r'<div class="op_url_size".*?</div>') mm = pattern.search(div_data) if mm: abstract=clearTag(mm.group(0)) else:#奇怪模式2,貌似是百科等自己的,反正和别人用的不是一个div class~ pattern = re.compile(r'<div class="c-span18 c-span-last">[\s\S]*?</p>') mmm = pattern.search(div_data)#这里用match和search结果不一致 #match是从字符串的起点开始做匹配,而search是从字符串做任意匹配。 if mmm: abstract=clearTag(mmm.group(0)) else: abstract="No description!" #print i return abstract.strip() if __name__ == "__main__": #初始化 keyword = raw_input('Please enter the keyword you want to search:') url = 'http://www.baidu.com/s?wd=' + my_urlencode(keyword) + '&rsv_bp=0&rsv_spt=3&rsv_n=2&inputT=6391' target_urls = [] target_urls.append(url) page_num = 2 #想多少页就多少页。。只要你有。。 for cnt in range(page_num): print "===============第",cnt+1,"页===============" if target_urls[cnt] == "END_FLAG": break res_lists,next_page_url = get_res_list_and_next_page_url(target_urls[cnt]) if next_page_url: #考虑没有“下一页”的情况 target_urls.append(next_page_url) else: target_urls.append("END_FLAG") titles = [] urls = [] abstracts = [] print len(res_lists) for index in range(len(res_lists)): print "第",index+1,"个搜索结果..." #获取title title = get_title(res_lists[index]).strip() titles.append(title) print "标题:",title #获取URL url = get_url(res_lists[index]) urls.append(url) print "URL:",url #获取描述 abstract = get_abstract(res_lists[index]).strip() abstracts.append(abstract) print "概要:",abstract print "\r\n\r\n"
相关文章推荐
- python爬虫(10)身边的翻译专家——获取有道翻译结果
- C++和python如何获取百度搜索结果页面下信息对应的真实链接(百度搜索爬虫,可指定页数)
- python爬虫爬取百度搜索结果
- python如何获取百度搜索结果的真实URL
- python 爬虫百度搜索结果
- Python爬虫爬取百度搜索结果——邮箱地址
- 根据查询的关键字,实现获取百度指定页数的搜索结果的信息(网页地址,标题,摘要,并有排序的说明)
- 解析百度搜索结果页面的python脚本(Linux/Win都可以运行)
- python实现提取百度搜索结果的方法
- 使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
- 利用python爬取海量疾病名称百度搜索词条目数的爬虫实现
- python,抓取百度搜索结果
- python使用get在百度搜索并保存第一页搜索结果
- 百度搜索结果中link?url 格式的真实地址获取方式
- 编写Python脚本来获取Google搜索结果的示例
- python实现的一只从百度开始不断搜索的小爬虫
- python实现的一只从百度开始不断搜索的小爬虫
- 解析百度搜索结果链接的url,获取真正的url
- Python 获取Twitter搜索结果