python爬虫(11)身边的搜索专家——获取百度搜索结果

使用python来抓取百度搜索的内容

思路:

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"





posted @ 2017-05-04 19:07  枫奇丶宛南  阅读(262)  评论(0编辑  收藏  举报