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"