爬虫笔记三
1、urllib和urllib2区别
urllib和urllib2都是接受URL请求的相关模块,但是提供了不同的功能,最显著的区别如下:
(1)urllib仅可以接受URL,不能创建,设置headers的request类实例;
(2)但是urllib提供urlencode()方法用来GET查询字符串的产生,而urllib2则没有(这是urllib和urllib2经常一起使用的主要原因)
(3)编码工作使用urllib的urlencode()函数,帮我们讲key:value这样的键值对转换成‘key=value’这样的字符串,解码工作可以使用urllib的unquote()
2、urllib库的urlencode()方法
# encoding=utf-8 # IPython2 中的测试结果 import urllib word = {"wd" : "博客园"} # 通过urllib.urlencode()方法,将字典键值对按URL编码转换,从而能被web服务器接受。 ret = urllib.urlencode(word) print ret # 通过urllib.unquote()方法,把 URL编码字符串,转换回原先字符串。 print urllib.unquote(ret) wd=%E5%8D%9A%E5%AE%A2%E5%9B%AD wd=博客园
3、urllib2库的urlopen(),Request()方法的使用
- GET请求一般用于我们向服务器获取数据。例如:用百度搜索:https://www.baidu.com/s?wd=中国
# encoding=utf-8 import urllib # 负责url编码处理 import urllib2 url = "http://www.baidu.com/s?" word = {"wd": "中国"} word = urllib.urlencode(word) # 转换成url编码格式(字符串) newurl = url + word # 拼接完整的url headers = { 'user-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36'} request = urllib2.Request(newurl, headers=headers) response = urllib2.urlopen(request) print response.read()
-
POST方式:了Request请求对象的里有data参数,它就是用在POST里的,我们要传送的数据就是这个参数data,data是一个字典,里面要匹配键值对。
# encoding=utf-8 import urllib2 import urllib # 有道翻译:http://fanyi.youdao.com/
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc' formdata = { "i": "警察", "from": "AUTO", "to": "AUTO", "smartresult": "dict", "client": "fanyideskweb", "doctype": "json", "version": "2.1", "keyfrom": "fanyi.web", "action": "FY_BY_REALTIME", "typoResult": "true" } data = urllib.urlencode(formdata) # 将字典以url形式编码 header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36', 'Referer': 'http://fanyi.youdao.com/', # 反盗链 } request = urllib2.Request(url=url, data=data, headers=header) response = urllib2.urlopen(request) print response.code # 响应状态码 print response.read() 200 {"type":"ZH_CN2EN","errorCode":0,"elapsedTime":0,"translateResult":[[{"src":"警察","tgt":"The police"}]]
4、 批量爬取贴吧页面数据
输入一个百度贴吧的地址,比如:
百度贴吧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都是以'https://tieba.baidu.com/f?'开头,然后是关键字 kw=‘’贴吧名字‘’,再后面是 &pn=页数 (pn=0第一页,pn=50第二页,依次类推)
1.先写一个main,提示用户输入要爬取的贴吧名,并用urllib.urlencode()进行转码,然后组合url
2.接下来,写一个百度贴吧爬虫接口tiebaSpider(),需要传递3个参数给这个接口, 一个是main里组合的url地址,以及起始页码和终止页码,表示要爬取页码的范围。
3.前面写出一个爬取一个网页的代码。然后,将它封装成一个小函数loadPage(),供我们使用。
4.将爬取到的每页的信息存储在本地磁盘上,我们可以简单写一个存储文件的接口writePage()
# _*_ coding:utf-8 _*_ import urllib,urllib2 def loadPage(url,filename): #根据url发送请求,获取服务器响应文件 print '正在下载' + filename headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36'}
request = urllib2.Request(url,headers = headers)
content = urllib2.urlopen(request).read() return content
def writePage(html,filename): #将html内容写入到本地 print '正在保存' + filename with open(unicode(filename,'utf-8'),'w') as f: f.write(html) print '_' * 30 def tiebaSpider(url,beginPage,endPage): #贴吧爬虫调度器,负责组合处理每个页面的url for page in range(beginPage,endPage + 1): pn = (page - 1) * 50 filename = '第' + str(page) + '页.html' fullurl = url + '&pn=' + str(pn) # print fullurl # 调用loadPage()发送请求获取HTML页面 html = loadPage(fullurl,filename) # 将获取到的HTML页面写入本地磁盘文件 writePage(html,filename) if __name__ == '__main__': kw = raw_input('请输入贴吧名:') beginPage = int(raw_input('请输入起始页:')) endPage = int(raw_input('请输入结束页:')) url = 'https://tieba.baidu.com/f?' key = urllib.urlencode({'kw':kw}) # 组合后的url示例:http://tieba.baidu.com/f?kw=lol url = url + key tiebaSpider(url,beginPage,endPage)
5、urllib2库获取Ajax加载的动态页面
只要response里面有 JSON数据,我们就可以找到服务器的数据来源
# encoding=utf-8 import urllib import urllib2 url = "https://movie.douban.com/j/chart/top_list?" headers = {"User-Agent": "Mozilla...."} # 处理所有参数 formdata = { 'type': '11', 'interval_id': '100:90', 'action': '', 'start': '0', 'limit': '10' } data = urllib.urlencode(formdata) request = urllib2.Request(url, data=data, headers=headers) response = urllib2.urlopen(request) print response.read()