用python语言编写网络爬虫

时间:2023-01-30 10:38:02

本文主要用到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)
add_unredirected_header(key,header)
has_header(header)
remove_header(header)
get_full_url(header)
set_proxy(host,type)
get_header(header_name,default=None)
15   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框架。

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

 import threading,time,pickle,re
import urllib.request class ProxyCheck(threading.Thread):
def __init__(self,proxylist):
threading.Thread.__init__(self)
self.proxylist = proxylist
self.timeout = 5
self.test_url = 'http://www.baidu.com'
self.test_str = ''
self.checkedProxyList = [] def checkProxy(self):
cookies = urllib.request.HTTPCookieProcessor()
for proxy in self.proxylist:
proxy_handler = urllib.request.ProxyHandler({'http':r'%s://%s:%s' %(proxy[0],proxy[1],proxy[2])})
opener = urllib.request.build_opener(cookies,proxy_handler)
opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36')]
urllib.request.install_opener(opener)
t1 = time.time()
try:
req = urllib.request.urlopen(self.test_url,timeout=self.timeout)
result = req.read().decode('utf-8')
timeused = time.time() - t1
pos = result.find(self.test_str)
if pos > 1:
self.checkedProxyList.append((proxy[0],proxy[1],proxy[2],proxy[3],timeused))
print((proxy[0],proxy[1],proxy[2],proxy[3],timeused))
else:
continue
except:
continue
# def sort(self):
# sorted(self.checkedProxyList,cmp=lambda x,y:cmp(x[4],y[4]))
def save(self,filename):
with open("%s.txt"%filename,'w') as f:
for proxy in self.checkedProxyList:
f.write("{}\t{}:{}\t{}\t{}\n".format(*proxy))
with open("%s.pickle"%filename,'wb') as fb:
pickle.dump(self.checkedProxyList,fb) def run(self):
self.checkProxy()
self.save("checked-50") class xiciProxy:
def __init__(self):
self.alllist = []
def grep(self,url):
# req = urllib.request.Request(url)
# req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '
# '(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36') result1 = urllib.request.urlopen(req)
result2 = result1.read().decode('utf-8') regex = r"<td>(\d+.\d+.\d+.\d+)</td>\n.*?" \
r"<td>(\d+)</td>\n.*?" \
r"\n.*?" \
r"<a href=.*?>(.*?)</a>\n.*?" \
r"\n.*?" \
r"\n.*?" \
r"<td>(HTTPS?)</td>"
get = re.findall(regex,result2)
proxylist = []
for i in get:
proxylist.append((i[3],i[0],i[1],i[2]))
return proxylist
def save(self,filename):
with open("%s.txt"%filename,'w') as f:
for proxy in self.alllist:
f.write("{}\t{}:{}\t{}\n".format(*proxy))
with open("%s.pickle"%filename,'wb') as fb:
pickle.dump(self.alllist,fb)
def run(self):
for i in range(51,1951):
url = "http://www.xicidaili.com/nn/{}".format(i)
print(url)
proxylist = self.grep(url)
self.alllist += proxylist
if i % 50 == 0:
self.save("xiciproxy-{}".format(i))
self.alllist = [] with open("xiciproxy-50.pickle","rb") as fb:
proxylist = pickle.load(fb)
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初学者之网络爬虫&lpar;二&rpar;

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

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

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

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

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

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

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

  7. &lbrack;Python学习&rsqb; 简单网络爬虫抓取博客文章及思想介绍

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

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

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

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

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

随机推荐

  1. ASP&period;NET Core应用中如何记录和查看日志

    日志记录不仅对于我们开发的应用,还是对于ASP.NET Core框架功能都是一项非常重要的功能特性.我们知道ASP.NET Core使用的是一个极具扩展性的日志系统,该系统由Logger.Logger ...

  2. 被我们忽略的HttpSession线程安全问题

    1. 背景 最近在读<Java concurrency in practice>(Java并发实战),其中1.4节提到了Java web的线程安全问题时有如下一段话: Servlets a ...

  3. iOS获取流量参考

    通过读取系统网络接口信息,获取当前iphone设备的流量相关信息,统计的是上次开机至今的流量信息. 2 倒入库: SystemConfiguration.framework 加入头文件: #inclu ...

  4. IE6 — 你若安好,便是晴天霹雳 &lbrack; 乱弹 &rsqb;

    为什么还有人在用IE6?估计和中国的盗版业有很大关系吧.小白的电脑启不来了,请人重装系统,一张古老的Ghost搞定,IE6便落地生根.今天碰到一例报告说某网站在IE6下丑陋吓人,无心无力去解决,于是来 ...

  5. Testing and Checking Refined

    还是James大叔的文章:http://www.satisfice.com/blog/archives/856 本文提出了Testing和checking的定义和他们之间的区别. ========== ...

  6. im4java开发向导

    0.搜索ImageMagick下载安装 1.Setting up the Environment    引入im4java到classpath    设置图片处理引擎的command searchpa ...

  7. 【bzoj3233】【ahoi2013】找硬币

    题意: 求确定n种货币面额x1..xn满足 x1=1 且xi为xj的整数倍(i>j) 给定n个物品价格ai 求使用上面货币最少需要硬币数(不能找零) 题解: 动态规划 听说网上的题解都是搜索的做 ...

  8. for语句输出图形

    一.输出以下图形 ******************************** 用for...for...嵌套循环,内循环控制每一行的个数(即列数),外循环控制行数 class ForDraw { ...

  9. SQL特殊comment语法

    SQL 注释的特殊用法: /*!版本号 语句*/ 表示大于等于某个版本是,才执行相应的语句. 在版本为5.7.23的MySQL上做测试如下: 测试1 mysql> select 1 /*!507 ...

  10. Redis 主从&plus;哨兵&plus;监控 (centos7&period;2 &plus; redis 3&period;2&period;9 )

    环境准备: 192.168.0.2  redis01 主 192.168.0.3  redis02 从 192.168.0.4  redis03 从 Redis 主从搭建 一:下载并安装redis软件 ...