用python语言编写网络爬虫

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

1、访问一个网址

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

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

2、urllib.request.Request(url,data=None,headers={})对象

属性:

full_url

type

host

data

selector

method

get_method()

add_header(key,val)            添加header

add_unredirected_header(key,header)

has_header(header)

remove_header(header)      移除header

get_full_url(header)             返回url

set_proxy(host,type)            设置代理;

get_proxies()                       获取代理

get_header(header_name,default=None)

header_items()

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

re.read()                读取内容,想要将内容保存下来,需先新建一个相应格式的文件,再将读取到的内容写入到这个文件内即可;

re.geturl()              可取得已打开对象的url地址;

re.info()                 可取得响应服务器的信息;

re.getcode()          可取得响应状态码;

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保留登录状态

login_data = {

‘_xsrf‘: getXSRF(baseurl),

‘password‘: password,

‘remember_me‘: ‘true‘,

‘email‘: email,

session = requests.session()
content = session.post(url, headers = headers_base, data = login_data)
s = session.get("http://www.zhihu.com", verify = False)
print s.text.encode(‘utf-8‘) 

(2)利用cookie进行登录

post = {

‘ua‘:self.ua,

‘TPL_checkcode‘:‘‘,

‘CtrlVersion‘: ‘1,0,0,7‘,

‘TPL_password‘:‘‘,

}

#将POST的数据进行编码转换

postData = urllib.urlencode(post)

cookie = cookielib.LWPCookieJar()

cookieHandler = urllib2.HTTPCookieProcessor(cookie)

opener = urllib2.build_opener(cookieHandler, urllib2.HTTPHandler)

#第一次登录获取验证码尝试,构建request

request = urllib2.Request(loginURL,postData,loginHeaders)

#得到第一次登录尝试的相应

response = self.opener.open(request)

#获取其中的内容

content = response.read().decode(‘gbk‘)

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

6、代理的使用

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

proxy_support = urllib.request.ProxyHandler({类型:代理ip和端口号})

opner = urllib.request.build_opener(proxy_suppoert)

urllib.request.install_opener(opener)        #可选

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 = ‘11000002000001‘
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
48 class xiciProxy:
49     def __init__(self):
50         self.alllist = []
51     def grep(self,url):
52         # req = urllib.request.Request(url)
53         # req.add_header(‘User-Agent‘, ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 ‘
54         #                             ‘(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36‘)
55
56
57         result1 = urllib.request.urlopen(req)
58         result2 = result1.read().decode(‘utf-8‘)
59
60         regex = r"<td>(\d+.\d+.\d+.\d+)</td>\n.*?" 61                 r"<td>(\d+)</td>\n.*?" 62                 r"\n.*?" 63                 r"<a href=.*?>(.*?)</a>\n.*?" 64                 r"\n.*?" 65                 r"\n.*?" 66                 r"<td>(HTTPS?)</td>"
67         get = re.findall(regex,result2)
68         proxylist = []
69         for i in get:
70             proxylist.append((i[3],i[0],i[1],i[2]))
71         return proxylist
72     def save(self,filename):
73         with open("%s.txt"%filename,‘w‘) as f:
74             for proxy in self.alllist:
75                 f.write("{}\t{}:{}\t{}\n".format(*proxy))
76         with open("%s.pickle"%filename,‘wb‘) as fb:
77             pickle.dump(self.alllist,fb)
78     def run(self):
79         for i in range(51,1951):
80             url = "http://www.xicidaili.com/nn/{}".format(i)
81             print(url)
82             proxylist = self.grep(url)
83             self.alllist += proxylist
84             if i % 50 == 0:
85                 self.save("xiciproxy-{}".format(i))
86                 self.alllist = []
87
88 with open("xiciproxy-50.pickle","rb") as fb:
89     proxylist = pickle.load(fb)
90 ProxyCheck(proxylist).run()
时间: 2024-10-15 21:33:24

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

搞几款由“Python”语言编写的“有趣、恶搞、好玩”的程序代码!

为提高大家对"Python"编程语言的学习兴趣,今天给大家分享几款有趣的Python程序代码,感兴趣的小伙伴可以跟着学习借鉴哦!进群:839383 765可以获取Python学习资料哦! 分享一:"啥是佩奇?"让Python语言告诉你用Python代码创作一副佩奇: <pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Co

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

一.代理池的维护 上面我们利用代理可以解决目标网站封IP的问题 在网上有大量公开的免费代理 或者我们也可以购买付费的代理IP但是无论是免费的还是付费的,都不能保证都是可用的 因为可能此IP被其他人使用来爬取同样的目标站点而被封禁或者代理服务器突然故障或者网络繁忙 一旦选用了一个不可用的代理,这势必会影响爬虫的工作效率 1.准备工作 需要安装Redis数据库并启动服务 另外还需要安装aiohttp.requests.redis-py.pyquery.flask库 redis数据库安装 下载地址 h

下载大数据实战课程第一季Python基础和网络爬虫数据分析

python语言近年来越来越被程序相关人员喜欢和使用,因为其不仅简单容易学习和掌握,而且还有丰富的第三方程序库和相应完善的管理工具:从命令行脚本程序到gui程序,从B/S到C/S,从图形技术到科学计算,软件开发到自动化测试,从云计算到虚拟化,所有这些领域都有python的身影:python已经深入到程序开发的各个领域,并且会越来越多的人学习和使用. 大数据实战课程第一季Python基础和网络爬虫数据分析,刚刚入手,转一注册文件,视频的确不错,可以先下载看看:链接:http://pan.baidu

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

        前面一直强调Python运用到网络爬虫方面非常有效,这篇文章也是结合学习的Python视频知识及我研究生数据挖掘方向的知识.从而简单介绍下Python是如何爬去网络数据的,文章知识非常简单,但是也分享给大家,就当简单入门吧!同时只分享知识,希望大家不要去做破坏网络的知识或侵犯别人的原创型文章.主要包括: 1.介绍爬取CSDN自己博客文章的简单思想及过程 2.实现Python源码爬取新浪韩寒博客的316篇文章 一.爬虫的简单思想      最近看刘兵的<Web数据挖掘>知道,在研

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

运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程 有关前两篇的链接: 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本.内核.当前时间 运用Python语言编写获取Linux基本系统信息(二):文件系统使用情况获取 一.实验环境: Python2.7.10.pycharm.VM虚拟机.CentOS6.3.mysql 二.MySQLdb模块: MySQLdb模式是Python中专门连接MySQL数据库的模块,另外Python开发环境的搭

Python写的网络爬虫程序(很简单)

Python写的网络爬虫程序(很简单) 这是我的一位同学传给我的一个小的网页爬虫程序,觉得挺有意思的,和大家分享一下.不过有一点需要注意,要用python2.3,如果用python3.4会有些问题出现. python程序如下: import re,urllib strTxt="" x=1 ff=open("wangzhi.txt","r") for line in ff.readlines(): f=open(str(x)+".txt&

Web2py是一个用Python语言编写的免费的开源Web框架

Zope 2是一款基于Python的Web应用框架,是所有Python Web应用程序.工具的鼻祖,是Python家族一个强有力的分支.Zope 2的"对象发布"系统非常适合面向对象开发方法,并且可以减轻开发者的学习曲线,还可以帮助你发现应用程序里一些不好的功能. Web2py是一个用Python语言编写的免费的开源Web框架,旨在敏捷快速的开发Web应用,具有快速.可扩展.安全以及可移植的数据库驱动的应用,遵循LGPLv3开源协议. Web2py提供一站式的解决方案,整个开发过程都可

Python 3开发网络爬虫(四): 登录

原文出处: Jecvay Notes (@Jecvay) <零基础自学用Python 3开发网络爬虫(一)> <零基础自学用Python 3开发网络爬虫(二)> <零基础自学用Python 3开发网络爬虫(三)> 今天的工作很有意思, 我们用 Python 来登录网站, 用Cookies记录登录信息, 然后就可以抓取登录之后才能看到的信息. 今天我们拿知乎网来做示范. 为什么是知乎? 这个很难解释, 但是肯定的是知乎这么大这么成功的网站完全不用我来帮他打广告. 知乎网的

Kitty:Python语言编写的Fuzzing框架

Kitty是一款用Python语言编写的开源的模块化.可扩展的模糊测试框架,灵感来源于OpenRCE’s Sulley 和 Michael Eddington的 (现在为Deja Vu Security的) Peach Fuzzer . 目标 我们开始写Kitty的时候,目的是帮助我们fuzz特殊的目标.也就就是运行于非TCP/IP通道上的私有和内部协议.一个通用.抽象的框架应该包含所有我们能想到的模糊测试过程中用到的所有通用功能,并且能方便用户扩展,以便用来攻击特定目标. 特性 心中有了这样的