本文主要用到python3自带的urllib模块编写轻量级的简单爬虫。至于怎么定位一个网页中具体元素的url可自行百度火狐浏览器的firebug插件或者谷歌浏览器的自带方法。

1、访问一个网址

re=urllib.request.urlopen('网址‘)

打开的也可以是个urllib.request.Request对象,后边也可以跟数据参数,当有传入数据时会自动变为POST请求;

2、urllib.request.Request(url,data=None,headers={})对象属性和方法

  1. full_url
  2. type
  3. host
  4. data
  5. selector
  6. method
  7. get_method()
  8. add_header(key,val)
  9. add_unredirected_header(key,header)
  10. has_header(header)
  11. remove_header(header)
  12. get_full_url(header)
  13. set_proxy(host,type)
  14. get_header(header_name,default=None)
    15   header_items()   

3、已连接对象的可用方法:

  1. re.read()          读取内容,想要将内容保存下来,需先新建一个相应格式的文件,再将读取到的内容写入到这个文件内即可;
  2. re.geturl()        可取得已打开对象的url地址;
  3. re.info()          可取得响应服务器的信息;
  4. re.getcode()        可取得响应状态码;
  5. urllib.parse.urlencode()  将一个存储post数据的字典转换成打开网页所需要的数据格式;

可用json.loads()将文本转换成键值对

可在传地址时将header以一个字典数据的形式传入,以隐藏自己的访问方式;也可用re.add_header('')    的方式进行追加;

4、当知道一个文件的url时可用此方法直接下载保存到本地

urllib.request.urlretrieve('http://wx1.sinaimg.cn/mw600/9bbc284bgy1ffkuafn4xtj20dw0jgh08.jpg','bc.jpg')

5、登录功能的实现(post)

(1)利用session保留登录状态

  1. login_data = {
  2. '_xsrf': getXSRF(baseurl),
  3. 'password': password,
  4. 'remember_me': 'true',
  5. 'email': email,
  6. session = requests.session()
  7. content = session.post(url, headers = headers_base, data = login_data)
  8. s = session.get("http://www.zhihu.com", verify = False)
  9. print s.text.encode('utf-8')

(2)利用cookie进行登录

  1. post = {
  2. 'ua':self.ua,
  3. 'TPL_checkcode':'',
  4. 'CtrlVersion': '1,0,0,7',
  5. 'TPL_password':'',
  6. }
  7. #将POST的数据进行编码转换
  8. postData = urllib.urlencode(post)
  9. cookie = cookielib.LWPCookieJar()
  10. cookieHandler = urllib2.HTTPCookieProcessor(cookie)
  11. opener = urllib2.build_opener(cookieHandler, urllib2.HTTPHandler)
  12. #第一次登录获取验证码尝试,构建request
  13. request = urllib2.Request(loginURL,postData,loginHeaders)
  14. #得到第一次登录尝试的相应
  15. response = self.opener.open(request)
  16. #获取其中的内容
  17. content = response.read().decode('gbk')

网站常用的编码方式有utf8,gbk,gb2132,gb18030等

6、代理的使用

同一个Ip设备在短时间内访问一个服务器次数过多会被服务器禁止访问,所以很多时候我们都需要用天代理来帮助我们解决这个问题。方法如下:

  1. proxy_support = urllib.request.ProxyHandler({类型:代理ip和端口号})
  2. opner = urllib.request.build_opener(proxy_suppoert)
  3. urllib.request.install_opener(opener) #可选安装
  4. opener.open(url) #或直接调用opener代理

注:如想实现更复杂的可使用更全面的scrapy框架。

附:自己写的一个验证网上代理的有效性的爬虫,此爬虫先从网站上获取代理的地址,然后使用这个代理来访问百度,验证是否能得到百度的网页,如能则将此代理地址保存。

  1. import threading,time,pickle,re
  2. import urllib.request
  3.  
  4. class ProxyCheck(threading.Thread):
  5. def __init__(self,proxylist):
  6. threading.Thread.__init__(self)
  7. self.proxylist = proxylist
  8. self.timeout = 5
  9. self.test_url = 'http://www.baidu.com'
  10. self.test_str = ''
  11. self.checkedProxyList = []
  12.  
  13. def checkProxy(self):
  14. cookies = urllib.request.HTTPCookieProcessor()
  15. for proxy in self.proxylist:
  16. proxy_handler = urllib.request.ProxyHandler({'http':r'%s://%s:%s' %(proxy[0],proxy[1],proxy[2])})
  17. opener = urllib.request.build_opener(cookies,proxy_handler)
  18. opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '
  19. '(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36')]
  20. urllib.request.install_opener(opener)
  21. t1 = time.time()
  22. try:
  23. req = urllib.request.urlopen(self.test_url,timeout=self.timeout)
  24. result = req.read().decode('utf-8')
  25. timeused = time.time() - t1
  26. pos = result.find(self.test_str)
  27. if pos > 1:
  28. self.checkedProxyList.append((proxy[0],proxy[1],proxy[2],proxy[3],timeused))
  29. print((proxy[0],proxy[1],proxy[2],proxy[3],timeused))
  30. else:
  31. continue
  32. except:
  33. continue
  34. # def sort(self):
  35. # sorted(self.checkedProxyList,cmp=lambda x,y:cmp(x[4],y[4]))
  36. def save(self,filename):
  37. with open("%s.txt"%filename,'w') as f:
  38. for proxy in self.checkedProxyList:
  39. f.write("{}\t{}:{}\t{}\t{}\n".format(*proxy))
  40. with open("%s.pickle"%filename,'wb') as fb:
  41. pickle.dump(self.checkedProxyList,fb)
  42.  
  43. def run(self):
  44. self.checkProxy()
  45. self.save("checked-50")
  46.  
  47. class xiciProxy:
  48. def __init__(self):
  49. self.alllist = []
  50. def grep(self,url):
  51. # req = urllib.request.Request(url)
  52. # req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '
  53. # '(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36')
  54.  
  55. result1 = urllib.request.urlopen(req)
  56. result2 = result1.read().decode('utf-8')
  57.  
  58. regex = r"<td>(\d+.\d+.\d+.\d+)</td>\n.*?" \
  59. r"<td>(\d+)</td>\n.*?" \
  60. r"\n.*?" \
  61. r"<a href=.*?>(.*?)</a>\n.*?" \
  62. r"\n.*?" \
  63. r"\n.*?" \
  64. r"<td>(HTTPS?)</td>"
  65. get = re.findall(regex,result2)
  66. proxylist = []
  67. for i in get:
  68. proxylist.append((i[3],i[0],i[1],i[2]))
  69. return proxylist
  70. def save(self,filename):
  71. with open("%s.txt"%filename,'w') as f:
  72. for proxy in self.alllist:
  73. f.write("{}\t{}:{}\t{}\n".format(*proxy))
  74. with open("%s.pickle"%filename,'wb') as fb:
  75. pickle.dump(self.alllist,fb)
  76. def run(self):
  77. for i in range(51,1951):
  78. url = "http://www.xicidaili.com/nn/{}".format(i)
  79. print(url)
  80. proxylist = self.grep(url)
  81. self.alllist += proxylist
  82. if i % 50 == 0:
  83. self.save("xiciproxy-{}".format(i))
  84. self.alllist = []
  85.  
  86. with open("xiciproxy-50.pickle","rb") as fb:
  87. proxylist = pickle.load(fb)
  88. ProxyCheck(proxylist).run()

用python语言编写网络爬虫的更多相关文章

  1. python3编写网络爬虫18-代理池的维护

    一.代理池的维护 上面我们利用代理可以解决目标网站封IP的问题 在网上有大量公开的免费代理 或者我们也可以购买付费的代理IP但是无论是免费的还是付费的,都不能保证都是可用的 因为可能此IP被其他人使用 ...

  2. Python语言编写BP神经网络

    Python语言编写BP神经网络 2016年10月31日 16:42:44 ldy944758217 阅读数 3135   人工神经网络是一种经典的机器学习模型,随着深度学习的发展神经网络模型日益完善 ...

  3. Python初学者之网络爬虫(二)

    声明:本文内容和涉及到的代码仅限于个人学习,任何人不得作为商业用途.转载请附上此文章地址 本篇文章Python初学者之网络爬虫的继续,最新代码已提交到https://github.com/octans ...

  4. 使用python/casperjs编写终极爬虫-客户端App的抓取-ZOL技术频道

    使用python/casperjs编写终极爬虫-客户端App的抓取-ZOL技术频道 使用python/casperjs编写终极爬虫-客户端App的抓取

  5. 运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程,把获取的信息存入数据库

    运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程 有关前两篇的链接: 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本.内核.当前时间 运 ...

  6. 运用Python语言编写获取Linux基本系统信息(二):文件系统使用情况获取

    本文跟着上一篇文章继续写,上一篇文章的链接 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本.内核.当前时间 一.随便说说 获取文件系统使用情况的思路和上一篇获取主要系统是 ...

  7. [Python学习] 简单网络爬虫抓取博客文章及思想介绍

            前面一直强调Python运用到网络爬虫方面很有效,这篇文章也是结合学习的Python视频知识及我研究生数据挖掘方向的知识.从而简介下Python是怎样爬去网络数据的,文章知识很easy ...

  8. 利用Python编写网络爬虫下载文章

    #coding: utf-8 #title..href... str0='blabla<a title="<论电影的七个元素>——关于我对电影的一些看法以及<后会无期 ...

  9. 吴裕雄--天生自然python学习笔记:编写网络爬虫代码获取指定网站的图片

    我们经常会在网上搜索井下载图片,然而一张一张地下载就太麻烦了,本案例 就是通过网络爬虫技术, 一次性下载该网站所有的图片并保存 . 网站图片下载并保存 将指定网站的 .jpg 和 .png 格式的图片 ...

随机推荐

  1. 13.什么是javabean,以及使用原则

    javabean简介 javabeans就是符合某种特定的规范的java类,使用javabeans的好处是解决代码的重复编写,减少代码 冗余,功能区分明确,提高了代码的维护性. javabean的设计 ...

  2. Python3分析sitemap.xml抓取导出全站链接

    最近网站从HTTPS转为HTTP,更换了网址,旧网址做了301重定向,折腾有点大,于是在百度站长平台提交网址,不管是主动推送还是手动提交,前提都是要整理网站的链接,手动添加太麻烦,效率低,于是就想写个 ...

  3. 普通RAID磁盘数据格式规范

    普通RAID磁盘数据格式规范 1.介绍 在当今的IT环境中,系统管理员希望改变他们正在使用的内部RAID方案,原因可能有以下几个:许多服务器都是附带RAID解决方案的,这些RAID解决方案是通过母板磁 ...

  4. Linux 压缩 与解压命令

    tar命令 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName gz命令 解压1:gunzip FileName.gz 解压2:gzip ...

  5. asp.net mvc视图中使用entitySet类型数据时提示出错

    asp.net mvc5视图中使用entitySet类型数据时提示以下错误 检查了一下引用,发现已经引用了System.Data.Linq了,可是还是一直提示出错, 后来发现还需要在Views文件夹下 ...

  6. vue路由跳转时判断用户是否登录功能

    通过判断该用户是否登录过,如果没有登录则跳转到login登录路由,如果登录则正常跳转. 一丶首先在用户登录前后分别给出一个状态来标识此用户是否登录(建议用vuex): 简单用vuex表示一下,不会可以 ...

  7. STL—list

    前面我们分析了vector,这篇介绍STL中另一个重要的容器list list的设计 list由三部分构成:list节点.list迭代器.list本身 list节点 list是一个双向链表,所以其li ...

  8. Odoo之Field

    字段描述符包含了字段的定义,下面是实例化一个字段时的属性: class Field(object): :param string: 字段标签(用户所见),如果不设置ORM将取用类的字段名(大写).:p ...

  9. Python面向对象编程(一)

    1.什么是面向对象 面向对象(oop)是一种抽象的方法来理解这个世界,世间万物都可以抽象成一个对象,一切事物都是由对象构成的.应用在编程中,是一种开发程序的方法,它将对象作为程序的基本单元. 2.面向 ...

  10. 为什么不需要为Python对象添加 getter 和 setter

    Getter 和 setter在java中被广泛使用.一个好的java编程准则为:将所有属性设置为私有的,同时为属性写getter和setter函数以供外部使用. 这样做的好处是属性的具体实现被隐藏, ...