004 爬虫(最初的爬虫方式,以及urllib2)
一:最初的爬取方式
1.代码示例
# coding=utf-8
import urllib2
request=urllib2.Request("http://www.baidu.com")
response=urllib2.urlopen(request)
print response.read()
2.request对象概念
python中的request其实就是python向服务器发出请求,得到其返回的信息。
3.urllib与urllib2
是功能强大的网络编程函数库,通过他们在网络上访问文件就像访问本地电脑上的文件一样。
与re模块结合,可以下载web页面,提取信息,这时最开始的抓取方式。
4.常见的请求方式
get
post
put
delete
二:Post方式的爬取
1.程序(post方式)
#coding=utf-8
import urllib
import urllib2
values={"wd":"python爬虫"}
data=urllib.urlencode(values)
url="http://www.baidu.com/s"
request=urllib2.Request(url,data)
response=urllib2.urlopen(request)
print response.read()
三:Get方式的爬
1.是?链接的情况
2.程序
#encoding=utf-8
import urllib
import urllib2
values={}
values['wd']="python爬虫"
data=urllib.urlencode(values)
url="http://www.baidu.com/s"
getUrl=url+"?"+data
request=urllib2.Request(getUrl)
response=urllib2.urlopen(request)
print response.read()
四:Header设置
1.原有
有些网站不会同意直接访问,如果有识别问题,站点不会响应
因此,为了完全模拟浏览器上的工作,需要设置一些Header的属性。
2.设置
user agent='Mozilla/4.0(compatible;MSIE 5.5;Windows NT)'
headers={'User-Agent':user agent}
request=urllib2.Request(url,data,headers)
五:使用代理访问
1.缘由
多次访问,目标网站会禁止你的访问,所以需要更换IP
2.免费的代理ip网站
http://www.xicidaili.com/

六:对上面知识点程序演示
1.爬虫
#encoding=utf-8
import urllib
import urllib2
import random
##获取html的功能函数
def get_html(url,headers,proxies,num_retries=2):
print 'Download:',url
req=urllib2.Request(url) ##设置请求头
req.add_header('User-Agent',random.choice(headers['User-Agent'])) ##设置代理
proxy_support=urllib2.ProxyHandler({'http':random.choice(proxies)})
opener=urllib2.build_opener(proxy_support);
urllib2.install_opener(opener) html=urllib2.urlopen(req).read()
return html
##主流程代码
headers={
"User-Agent":["Mozilla/5.0(Windows NT 10.0;WOW64;rv:50.0) Gecko/20100101 Firefox/50.0"]
}
proxies=["61.135.217.7:80","114.247.209.130:8080"]
html=get_html("https://www.tmall.com",headers,proxies)
print html
七:异常处理
1.URLError
产生的原因如下:
网络无连接,链接不到指定的服务器,服务器不存在。
2.解决方式
使用try except
程序示例如下:
import urllib2
request=urllib2.Request("www.12334rer.com")
try:
response=urllib2.urlopen(request)
except urllib2.URLError,e:
print e.reason
print 1
3.HttpError
是URLError的子类,在利用urlopen方法发出一个请求后,服务器都会对应一个应答对象response,其中它包含一个数字“状态吗”,表示Http协议所返回的响应的状态。
注意点:except的顺序。
程序示例如下:
#-*- coding: UTF-8 -*-
import urllib2
req = urllib2.Request('http://blog.csdn.net/cqcre1')
try:
urllib2.urlopen(req)
except urllib2.HTTPError,e:
print e.code
except urllib2.URLError, e:
print e.reason
else:
print "OK"
显示403,表示禁止访问。
八:正则表达式
1.Re模块
自带的re模块,提供正则表达式的支持。
主要用到的方法:
#返回pattern对象
re.compile(string,[,flag])
#匹配所用的函数
re.match(pattern,string[,flag])
re.search(pattern,string[,flag])
re.split(pattern,string[,maxsplit])
re.findall(pattern,string[,flag])
2.pattern的创建
pattern=re,compile(r'hello')
3.flag参数
flag是匹配模式
可以使用‘|’进行同时生效。
re.I:表示忽略大小写
re.M:多行模式
4.程序示例
#-*- coding: UTF-8 -*-
# 导入re模块
import re # 将正则表达式编译成Pattern对象,注意hello前面的r的意思是“原生字符串”
pattern = re.compile(r'hello') # 使用re.match匹配文本,获得匹配结果,无法匹配时将返回None
result1 = re.match(pattern, 'a12')
result2 = re.match(pattern, 'helloo CQC!')
result3 = re.match(pattern, 'helo123 CQC!')
result4 = re.match(pattern, 'hello CQC!')
# 如果1匹配成功
if result1:
# 使用Match获得分组信息
print result1.group()
else:
print '1匹配失败!' # 如果2匹配成功
if result2:
# 使用Match获得分组信息
print result2.group()
else:
print '2匹配失败!' # 如果3匹配成功
if result3:
# 使用Match获得分组信息
print result3.group()
else:
print '3匹配失败!' # 如果4匹配成功
if result4:
# 使用Match获得分组信息
print result4.group()
else:
print '4匹配失败!'
5.正则表达式的语法
主要是那些模糊查找。
6.程序示例代码
#-*- coding: UTF-8 -*-
import urllib
import urllib2
import random
import re
import sys ##设置编码
reload(sys)
sys.setdefaultencoding('utf-8') def get_html(url,headers,proxies,num_retries=2):
print 'Downloading:',url
#设置请求头,模拟浏览器访问
req=urllib2.Request(url)
req.add_header("User-Agent",random.choice(headers['User-Agent']))
#设置代理
proxy_support=urllib2.ProxyHandler({'http':random.choice(proxies)})
opener=urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)
html=urllib2.urlopen(req).read()
return html
headers={
"User-Agent":["Mozilla/5.0(Windows NT 10.0;WOW64;rv:50.0) Gecko/20100101 Firefox/50.0"]
}
proxies=["121.31.101.107:8123","113.58.235.60:808"]
html=get_html("https://www.tmall.com",headers,proxies)
# print html
links=re.findall("<a href=\"(.+?)\">(.+?)</a>",html)
for link in links:
print link[0]
print link[1].encode("utf-8")
7.效果

8.将数据存储到Excel表格
前提:

9.程序示例
#-*- coding: UTF-8 -*-
import urllib
import urllib2
import random
import re
import sys import xlwt
reload(sys)
sys.setdefaultencoding('utf-8')
def get_html(url,headers,proxies,num_retries=2):
print 'Downloading:',url
#设置请求头,模拟浏览器访问
req=urllib2.Request(url)
req.add_header("User-Agent",random.choice(headers['User-Agent']))
#设置代理
proxy_support=urllib2.ProxyHandler({'http':random.choice(proxies)})
opener=urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)
html=urllib2.urlopen(req).read()
return html def saveData(datalist, savepath):
book = xlwt.Workbook(encoding='utf-8', style_compression=0)
sheet = book.add_sheet('天猫首页链接信息', cell_overwrite_ok=True)
col = (u'编号', u'内容', u'链接')
for i in range(0, 3):
sheet.write(0, i, col[i]) # 列名 第一个参数表示第几行 第二个参数表示第几列 第三个参数表示内容
i=0
print len(datalist)
for link in datalist:
i=i+1
sheet.write(i, 0, i) # 数据 写编号
for j in range(1,3):
sheet.write(i,j, link[j-1].encode("utf-8")) # 数据
book.save(savepath) # 保存 headers={
"User-Agent":["Mozilla/5.0(Windows NT 10.0;WOW64;rv:50.0) Gecko/20100101 Firefox/50.0"]
}
proxies=["121.31.101.107:8123","113.58.235.60:808"]
html=get_html("https://www.tmall.com",headers,proxies)
# print html
links=re.findall("<a href=\"(.+?)\">(.+?"
")</a>",html)
for link in links:
print link[0],link[1].encode("utf-8")
saveData(links,'TmallLink.xls')
10.效果展示

004 爬虫(最初的爬虫方式,以及urllib2)的更多相关文章
- 爬虫框架存储pymysql方式
爬虫框架存储pymysql方式# -*- coding: utf-8 -*-import pymysql# Define your item pipelines here## Don't forget ...
- Python爬虫与反爬虫(7)
[Python基础知识]Python爬虫与反爬虫(7) 很久没有补爬虫了,相信在白蚁二周年庆的活动大厅比赛中遇到了关于反爬虫的问题吧 这节我会做个基本分享. 从功能上来讲,爬虫一般分为数据采集,处理, ...
- python-day2爬虫基础之爬虫基本架构
今天主要学习了爬虫的基本架构,下边做一下总结: 1.首先要有一个爬虫调度端,来启动爬虫.停止爬虫或者是监视爬虫的运行情况,在爬虫程序中有三个模块,首先是URL管理器来对将要爬取的URL以及爬取过的UR ...
- 【Python网络爬虫一】爬虫原理和URL基本构成
1.爬虫定义 网络爬虫,即Web Spider,是一个很形象的名字.把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛.网络蜘蛛是通过网页的链接地址来寻找网页的.从网站某一个页面(通常 ...
- crawler_爬虫_反爬虫策略
关于反爬虫和恶意攻击的一些策略和思路 有时网站经常受到恶意spider攻击,疯狂抓取网站内容,对网站性能有较大影响. 下面我说说一些反恶意spider和spam的策略和思路. 1. 通过日志分析来 ...
- Python爬虫-01:爬虫的概念及分类
目录 # 1. 为什么要爬虫? 2. 什么是爬虫? 3. 爬虫如何抓取网页数据? # 4. Python爬虫的优势? 5. 学习路线 6. 爬虫的分类 6.1 通用爬虫: 6.2 聚焦爬虫: # 1. ...
- python爬虫之反爬虫(随机user-agent,获取代理ip,检测代理ip可用性)
python爬虫之反爬虫(随机user-agent,获取代理ip,检测代理ip可用性) 目录 随机User-Agent 获取代理ip 检测代理ip可用性 随机User-Agent fake_usera ...
- C#爬虫与反爬虫--字体加密篇
爬虫和反爬虫是一条很长的路,遇到过js加密,flash加密.重点信息生成图片.css图片定位.请求头.....等手段:今天我们来聊一聊字体: 那是一个偶然我遇到了这个网站,把价格信息全加密了:浏览器展 ...
- Java 多线程爬虫及分布式爬虫架构探索
这是 Java 爬虫系列博文的第五篇,在上一篇 Java 爬虫服务器被屏蔽,不要慌,咱们换一台服务器 中,我们简单的聊反爬虫策略和反反爬虫方法,主要针对的是 IP 被封及其对应办法.前面几篇文章我们把 ...
随机推荐
- vue-router 实践
1. vue-router2学习实践笔记 2. router.push() 3. 使用vue-router跳转页面
- Mongodb 笔记06 副本集的组成、从应用程序连接副本集、管理
副本集的组成 1. 同步:MongoDB的复制功能是使用操作日志oplog实现的,操作日志包含了主节点的每一次写操作.oplog是主节点的local数据库中的一个固定集合.备份节点通过查询整个集合就可 ...
- asp.net中GridView传多个值到其它页面的方法
网站开发中,在页面之间的跳转,经常会用到传值,其中可能会传递多个值. 一.CommadArgument传多个值到其他页面. 像Gridview dataList repeater等数据绑定控件中,可以 ...
- 【转】WPF绑定模式
源地址:http://www.cnblogs.com/zjz008/archive/2010/05/26/1744802.html http://blog.csdn.net/haylhf/articl ...
- shell操作典型案例--FTP操作
从FTP服务器上下载文件或上传文件到FTP服务器是生产环境中比较常见的场景之一. shell操作FTP的方式整理如下: 思路一:使用shell调用ftp等客户端 使用FTP方式,通过shell调用ft ...
- 如何在阿里云Centos下安装Nginx
Nginx("engine x")是一款轻量级的HTTP和反向代理服务器.相比于Apache.lighttpd等,它具有占有内存少.并发能力强.稳定性高等优势.它最常见的用途就是提 ...
- MS Office CVE-2015-1641 恶意 Exploit 样本分析
MS Office CVE-2015-1641 恶意 Exploit 样本分析 在对最近的一个恶意 MS Office 文档样本进行分析时,我们发现了一些有趣的特性.这个文档利用 CVE-2015-1 ...
- 20165227朱越 预备作业3 Linux安装及学习
预备作业3 Linux安装及学习 Linux的安装 虚拟机的安装远没有想象中的那样容易,下载还没有出现什么问题,当我安装的时候,第一个问题出现在创建虚拟机时选择安装的虚拟机版本和类型的时候的错误 当时 ...
- JBoss6.1.0修改启动jvm内存以及修改日志级别【转】
转自 JBoss6.1.0修改启动jvm内存以及修改日志级别 - liangbinny的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/liangbinny/arti ...
- Python缓存技术,装x新高度。
一段非常简单代码 普通调用方式 def console1(a, b): print("进入函数") return (a, b) print(console1(3, 'a')) pr ...