python爬虫爬取百度搜索结果

python爬虫爬取百度搜索结果


用到的工具

  • python
  • urllib
  • BeautifulSoup

简介

  • 爬虫的思路是用程序模拟浏览器浏览网页的工程,通过获取网页内容,并利用正则表达式等来提取页面上自己需要的内容.

工作流程

  • 构建访问请求
  • 获取网站响应
  • 提取关键数据

构建访问请求

request

pthon可以由urllib.Request类来构建http,ftp等网络访问请求.

对于Request类的构造函数主要需要以下几个参数:

  • url
  • data
  • header

url

由三部分组成:

  • 协议:如http,ftp等
  • 主机名域名
  • 主机对应目录

data

当使用post方法提交request时使用。
可以利用urlencode函数将python字典编码为post data

values = {"username":"xxx","password":"xxx"}
data = urllib.urlencode(values) 
url = "https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn"
request = urllib2.Request(url,data)
response = urllib2.urlopen(request)
print response.read()

当使用get方式时,只需要将请求编码到url中即可。
但要注意url的合法字符集仅包括部分asiic码。因此其他字符通常转为utf-8编码后,每两位前加%.如某字符的utf-8编码为ABCDEF,则该字符需要转换为%ab%cd%ef。
还好urllib2.quote()为我们实现了上述操作。

urllib2.Request('http://www.baidu.com/s?wd='+urllib.quote(line.strip().decode(sys.stdin.encoding).encode('gbk')))

上面代码极有可能还不能正常工作。因为大多数网站对没有正确header的request不予响应。
header是浏览器标志,我们通常需要完全伪装成浏览器才行。
我们可以使用浏览器调试模式,监测network请求,找到响应请求就可以找到对应header了。

import urllib  
import urllib2  

url = 'http://www.server.com/login'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'  
values = {'username' : 'xxx',  'password' : 'XXXX' }  
headers = { 'User-Agent' : user_agent }  
data = urllib.urlencode(values)  
request = urllib2.Request(url, data, headers)  
response = urllib2.urlopen(request)  
page = response.read()

BeautifulSoup

安装

sudo apt-get install Python-bs4

初始化

可以有response.read()来初始化一个soup对象

soup.prettify()

可以将压缩格式后的网页文件字符串重新格式化。
提高可读性,方便我们在页面中寻找感兴趣的内容。

soup对象会自动将文件生成文档树。
每个节点是一个tag类,该类实现了str()方法,方便我们的使用。

soup对象具有很多遍历查找对象的方法。

我个人比较喜欢使用soup.select()方法来查找后代对象。

该方法返回一个满足过滤条件的tag对象的list。
过滤条件的语法使用css选择器的语法,简洁方便,非常好用。
如下文中的:

soup.select('div.result h3.t > a')

高级特性

利用以上的知识,我们已经可以实现一个如下的爬虫demo程序了。
可以满足一些个人需求了。

一些值得注意的地方:

  • 由于一些网站的ip流量限制,你可能需要使用代理服务器。
  • 高效的爬虫还需要考虑并发,IO,数据库存储等。
  • 有很多开源爬虫库来帮我们解决以上问题,以上虽然只是一些基础原理,但仍有必要掌握。

以下是一个爬取百度搜索结果的demo程序。

#coding=utf-8
import urllib2
import urllib
from bs4 import BeautifulSoup
import sys
import re




with open('data.txt','wa') as f:
    key_word = []
    with open('key_word.txt','r') as kf:
        for line in kf:
            request = urllib2.Request('http://www.baidu.com/s?wd='+urllib.quote(line.strip().decode(sys.stdin.encoding).encode('gbk')))
            response = urllib2.urlopen(request)

            soup = BeautifulSoup(response.read())

            data = [re.sub(u'<[\d\D]*?>',' ',str(item)) for item in soup.select('div.result h3.t > a')]

            for item in data:
                f.writelines(''.join(item.strip().split())+'\n')

你可能感兴趣的:(python)