首页 > 其他 > 详细

爬虫笔记三

时间:2018-09-15 15:09:16      阅读:162      评论:0      收藏:0      [点我收藏+]

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()

 

 

爬虫笔记三

原文:https://www.cnblogs.com/Mint-diary/p/9650874.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!