Python入门学习:模拟浏览器查询百度获取结果

技术 赵有财 4208℃ 0评论

本来学习Python就是想和SEO相关的,所以就在学习的时候把一下常见的需求引进来,这样动力大,学起来就快一些,深刻一些了。SEO最常用的的恐怕就是查询关键词的排名了,手动查询又慢,有个好工具那肯定是梦寐以求的,那就开始了。
首先需要引人两个模块:

import urllib.request
from bs4 import BeautifulSoup

然后就是通过关键词,构造查询的URL:

keywords = '胜利日阅兵安排'
wd = urllib.request.quote(keywords)
url = 'http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&ch=12&tn=56060048_4_pg&wd='+wd
url = url+'&rsv_pq=ff64d901000031d4&rsv_t=1b7cB%2FKAQLLDfettJz2WrartM10yMWFSwzgBoHAmYV2X6Dv3mqbDMJyJyfplrLpO%2BP8XKA&rsv_enter=1&rsv_sug3=5&rsv_sug1=4&rsv_sug2=0&inputT=6285&rsv_sug4=11467'

要提交获取搜索结果前,必须要构造一个HTTP请求的头,否则是无法返回数据的。构造header就是定义一个字典:

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
           'Accept':'text/html;q=0.9,*/*;q=0.8',
           'Accept-Charset':'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
           'Accept-Encoding':'gzip',
           'Connection':'close',
           'Referer':None #注意如果依然不能抓取的话,这里可以设置抓取网站的host
}

然后构造一个请求,把header的数据加进去,打开网页的时候一起提交:

opener = urllib.request.build_opener()
opener.addheaders = [headers]

page = urllib.request.urlopen(url).read().decode('utf-8')

获取了页面源代码后,需要将它转为BeautifulSoup 4对象方便操作提取数据:

html = BeautifulSoup(page)

接着就可以开始取数了,这个过程比较复杂,还有部分的不能正确提取,大多数是百度的其他产品,非自然结果,先暂时返回无法获取,有时间再慢慢的提取。

开始代码前先下个页面来研究一下规律:

每条结果都会存在一个div id=”,id是唯一的,接着就是h3是结果的标题,百科是h4,然后提取描述,正常的描述会在一个class=’abstract’的div下的p里面,百科会没有P标签,然后就是提取URL了,正常会在class=’g’的span里,特殊点的暂时找到在class=’op-bk-polysemy-move’的p里面。

基本就这些规律,更复杂的需要查询更多的结果来分析总结,先写个一般的能用的就行了。

然后用循环把结果打印出来。

for i in range(1,11):
    res = html.find(id=i)
    print('第',i,'条结果:')
    if res.h3 != None:
        print(res.h3.get_text(strip=True))
    elif res.h4 != None:
        print(res.h4.get_text(strip=True))
    else:
        print('无法提取标题')
    if res.find('div',class_='c-abstract') !=None:
        print(res.find('div',class_='c-abstract').get_text(strip=True))
    elif res.find('div',class_='c-span18') !=None:
        if res.find('div',class_='c-span18').p !=None:
            print(res.find('div',class_='c-span18').p.get_text(strip=True))
        else:
            print(res.find('div',class_='c-span18').get_text(strip=True))
    else:
        print('无法提取描述')
    if res.find('span',class_='g') != None:
        print('网站:',res.find('span',class_='g').get_text(strip=True).split('/')[0])
    elif res.find('p',class_='op-bk-polysemy-move') !=None:
        print('网站:',res.find('p',class_='op-bk-polysemy-move').get_text(strip=True).split('/')[0])
    else:
        print('无法提取网址')
    print('\n')

另外,为了查第二页的结果,我们还要提取一下下一页的URL,再读出第二页的数据:

nextPage = html.find('a',class_='n').get('href')
nextPage = 'http://www.baidu.com/'+nextPage

page = urllib.request.urlopen(nextPage).read().decode('utf-8')

html = BeautifulSoup(page)

然后再用上面的循环代码打印出第二页的结果。

总结:获取结果应该写成函数就好了,因为本身没有完善,而且把结果打印来看不好返回值,以后有时间再完善了。

转载请注明:「知而不乎」 » Python入门学习:模拟浏览器查询百度获取结果

喜欢 (19)or分享 (0)
如果你觉得这篇文章还有价值,对你有帮助,请支持我继续更新 !捐赠本站

关注微信公众号

知而不乎微信公众号