Python爬虫urllib2库基本使用
demo01
# -*- coding:utf-8 -*- import urllib2 # 导入urllib2库 # 向指定的url发送请求, 并返回服务器相应的 类文件对象 response = urllib2.urlopen('http://www.baidu.com') # 类文件对象支持 文件对象的操作方法, 如read()方法读取文件全部内容 html = response.read() # 打印字符串 print html
demo02
import urllib2 # Request # 如果需要执行更复杂的操作, 比如增加HTTP报头, 必须创建一个Request实例来作为urlopen()的参数 # 访问的url地址则作为Request实例的参数 # url 作为Request()方法的参数, 并构造返回一个Request对象 request = urllib2.Request('http://www.baidu.com') # Request对象作为urlopen()方法的参数, 发送给服务器并接受响应 response = urllib2.urlopen(request) html = response.read() print html
demo03
import urllib2 # Request(url, data, headers) # url # data url提交的数据, POST请求 # headers 是一个字典 包含需要发送的HTTP报头的键值对 url = 'http://www.itcast.cn' # IE9.0 的User-Agent header = {'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;'} request = urllib2.Request(url, headers=header) # 通过调用Request.add_header() 添加/修改一个特定的header request.add_header('Connection', 'keep-alive') # 调用Request.add_header()来看header信息 # request.get_header(header_name='Connection') response = urllib2.urlopen(request) html = response.read() print html
demo04
# -*- coding:utf-8 -*- import urllib2 import random # 随机添加/修改User-Agent url = 'http://www.itcast.cn' ua_list = [ "Mozilla/5.0 (Windows NT 6.1; ) Apple.... ", "Mozilla/5.0 (X11; CrOS i686 2268.111.0)... ", "Mozilla/5.0 (Macintosh; U; PPC Mac OS X.... ", "Mozilla/5.0 (Macintosh; Intel Mac OS... " ] user_agent = random.choice(ua_list) request = urllib2.Request(url) # 调用Request.add_header() 添加/修改一个特定的header request.add_header('User-Agent', user_agent) # 第一个字母大写, 后面的全部小写 request.get_header('User-agent') response = urllib2.urlopen(request) html = response.read() print html
- urllib 仅可以接受URL,不能创建 设置了headers 的Request 类实例;
- 但是 urllib 提供 urlencode 方法用来GET查询字符串的产生,而 urllib2 则没有。(这是 urllib 和 urllib2 经常一起使用的主要原因)
- 编码工作使用urllib的urlencode()函数,帮我们将key:value这样的键值对转换成"key=value"这样的字符串,解码工作可以使用urllib的unquote()函数。(注意,不是urllib2.urlencode() )
# ipython2中的测试结果 In [1]: import urllib In [2]: word = {'q': 'python爬虫'} # urllib.urlencode()方法, 将字典键值对按URL编码转换, 从而能被web服务器接受 In [3]: urllib.urlencode(word) Out[3]: 'q=python%E7%88%AC%E8%99%AB' # 通过urllib.unquote()方法, 把URL编码字符串 转换回原先字符串 In [4]: print urllib.unquote('q=python%E7%88%AC%E8%99%AB') q=python爬虫
get请求 用于我们向服务器获取数据
例 http://www.google.com.hk/search?q=Python爬虫
import urllib # 负责url编码处理 import urllib2 url = 'http://www.google.com.hk/search' word = {'q': 'Python爬虫'} word = urllib.urlencode(word) # 转换成url编码格式(字符串) new_url = url + '?' + word # url首个分隔符就是? header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"} request = urllib2.Request(new_url, headers=header) response = urllib2.urlopen(request) print response.read()
批量爬取贴吧页面数据
mport urllib import urllib2 """ 批量爬取贴吧页面数据 百度贴吧LOL吧 第一页:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0 第二页: http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=50 第三页: http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100 贴吧中每个页面不同之处,就是url最后的pn的值,其余的都是一样的,我们可以抓住这个规律。 """ def writeFile(html, filename): """ 作用: 爆粗安服务器相应文件到本地磁盘文件里 :param html: 服务器响应文件 :param filename: 本地磁盘文件名 """ print '正在存储' + filename with open(filename, 'w') as f: f.write(html) print '-' * 50 def loadPage(url, filename): """ 作用:根据url发送请求, 获取服务器响应文件 :param url: 爬取的url地址 :param filename: 文件名 :return 返回服务器相应文件 """ print '正在下载' + filename headers = {"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"} request = urllib2.Request(url, headers=headers) response = urllib2.urlopen(request) return response.read() def tiebaSpider(url, beginPage, endPage): """ 作用: 负责处理url, 分配每个url去发送请求 :param url: 需要处理的第一个url :param beginPage: 爬虫执行的起始页面 :param endPage: 爬虫执行的截止页面 """ for page in range(beginPage, endPage+1): pn = (page - 1) * 50 filename = '第' + str(page) + '页.html' # 组合完整的url, 并且pn值每次增加50 fullurl = url + '&pn=' + str(pn) # 调用loadPage()发送请求获取HTML页面 html = loadPage(fullurl, filename) # 将获取到的HTML页面写入本地磁盘文件 writeFile(html, filename) # 模拟 main 函数 if __name__ == '__main__': kw = raw_input('请输入要爬取的贴吧:') # 输入起始页和终止页, str转成int类型 beginPage = int(raw_input('请输入起始页')) endPage = int(raw_input('请输入终止页')) url = 'http://tieba.baidu.com/f?' key = urllib.urlencode({'kw': kw}) # 组合url url = url + key tiebaSpider(url, beginPage, endPage)