大家好,关于Python网络爬虫教程与实战学习指南很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
响应=urllib2.urlopen("http://www.baidu.com")
print response.read() 首先我们调用urllib2 库中的urlopen 方法并传入一个URL。这个URL就是百度首页,协议是HTTP协议。
urlopen(url, 数据, 超时)
第一个参数url是URL,第二个参数data是访问URL时要传输的数据,第三个timeout是设置超时时间。
响应对象有一个read方法,可以返回获取到的网页内容。
其实上面的urlopen参数可以在request请求中传入,它实际上是Request类的一个实例。构建时需要传入Url、Data等。
导入urllib2
request=urllib2.Request("http://www.baidu.com")
响应=urllib2.urlopen(请求)
print response.read()
2.数据传送方式
postpost方法包含向服务器发送请求时的数据数据。
导入urllib
导入urllib2
值={}
value["用户名"]="1016903103@qq.com"
值["密码"]="XXXX"
数据=urllib.urlencode(值)
url="http://passport.csdn.net/account/login?来自=http://my.csdn.net/my/mycsdn"
请求=urllib2.Request(url,数据)
响应=urllib2.urlopen(请求)
print response.read()GET 且GET方法直接将data数据集成到请求链接中
导入urllib
导入urllib2
值={}
value["用户名"]="1016903103@qq.com"
值["密码"]="XXXX"
数据=urllib.urlencode(值)
url="http://passport.csdn.net/account/login"
geturl=url + "?" + 数据
请求=urllib2.Request(geturl)
响应=urllib2.urlopen(请求)
print response.read()
3. Urllib库的高级用法
设置Headers的目的是为了完全模拟浏览器浏览网页的特性,以防某些网站禁止爬虫程序运行。
首先是设置User-Agent
导入urllib
导入urllib2
url="http://www.server.com/login"
user_agent="Mozilla/4.0(兼容;MSIE 5.5;Windows NT)"
值={"用户名":"cqc","密码":"XXXX"}
headers={ "用户代理" : user_agent }
数据=urllib.urlencode(值)
request=urllib2.Request(url, 数据, headers)
响应=urllib2.urlopen(请求)
page=response.read()下有一个处理防盗链的方法。在headers 中添加referer,即将该属性设置为服务器本身。
headers={ "User-Agent" : "Mozilla/4.0(兼容;MSIE 5.5;Windows NT)" ,
"Referer":"http://www.zhihu.com/articles" } 总之,尽量模拟真实浏览器的headers 内容,构建时写入相同的数据
Proxy代理设置主要是用来应对一些会检测IP访问量的网站。如果次数太多,会被禁止访问,所以要设置代理服务器。
导入urllib2
启用_代理=真
proxy_handler=urllib2.ProxyHandler({"http" : "http://some-proxy.com:8080"})
null_proxy_handler=urllib2.ProxyHandler({})
如果启用_proxy:
开启器=urllib2.build_opener(proxy_handler)
否则:
开启器=urllib2.build_opener(null_proxy_handler)
urllib2.install_opener(opener) 超时设置urlopen 函数的第三个参数是超时设置。它有一个默认参数,所以如果要设置超时时间,需要以默认参数的形式设置timeout=10。
导入urllib2
response=urllib2.urlopen("http://www.baidu.com", timeout=10)
4. URLError的处理
就是使用try except语句捕获异常并处理。一个技巧是,父类的异常应该写到异常后面的子类中,这样子类异常捕获不到的情况下,父类异常也能捕获到。
这里HTTPError是URLError的子类,所以捕获异常的代码可以这样写。另外还增加了hasattr属性来提前判断属性。首先判断异常属性,避免出现属性输出错误的现象:
导入urllib2
req=urllib2.Request("http://blog.csdn.net/cqcre")
尝试:
urllib2.urlopen(请求)
除了urllib2.HTTPError、e:
if hasattr(e,"代码"):
打印代码
除了urllib2.URLError,e:
if hasattr(e,"原因"):
打印电子原因
否则:
print "OK"
5. Cookie的使用
Cookie是网站为了识别用户身份并进行会话跟踪而存储在用户本地终端的数据。 (加密)
对于需要登录后才能访问的页面,可以使用Urllib2库保存登录cookie,然后抓取页面。
目的是模拟登录状态。
opener 前面使用的opener是默认的,使用urlopen获取,相当于opener的一个特殊实例。然而,要使用cookie等高级功能,必须创建一个更通用的opener来实现这些功能。
下面是使用cookie处理器然后调用build_opener函数创建一个通用的opener对象,然后调用open方法打开url或者request
要获取cookie 并将其保存在变量中,请使用Cookielib 模块。该模块的功能是提供可以存储cookie的对象,并使用CookieJar类的对象来捕获cookie。
导入urllib2
导入cookielib
#这里声明一个CookieJar对象实例来保存cookie
cookie=coolielib.CookieJar()
#然后使用urllib2的HTTPCookieProcessor对象来创建cookie处理器
处理程序=urllib2.HTTPCookieProcessor(cookie)
#然后通过handler创建opener
开启器=urllib2.build_opener(处理程序)
#然后调用opener的open方法,当然也可以传入请求
response=opener.open("http://www.baidu.com") 这将cookie保存在变量中
要将cookie 保存到文件,请使用FileCookieJar 类对象。此处,使用MozillaCookieJar 对象。
CookieJar --- 派生--- FileCookieJar --- 派生--- MozillaCookieJar 和LWPCookieJar
cookie的获取和处理与上面类似,只不过最后调用了save方法并存储在之前已经传递给MozillaCookieJar的文件中。
导入cookielib
导入urllib2
#设置保存cookie的文件,同目录下的cookie.txt
文件名="cookie.txt"
#声明一个MozillaCookieJar对象实例来保存cookie,然后将其写入文件
cookie=cookielib.MozillaCookieJar(文件名)
#使用urllib2库的HTTPCookieProcessor对象创建cookie处理器
处理程序=urllib2.HTTPCookieProcessor(cookie)
#通过handler构建opener
开启器=urllib2.build_opener(处理程序)
#创建请求,原理与urllib2的urlopen相同
响应=opener.open("http://www.baidu.com")
#将cookie保存到文件中
cookie.save(ignore_discard=True,ignore_expires=True) 最后的ignore_discard是即使cookie被丢弃也要保存,ignore_exporres是如果cookie文件存在则覆盖原文件。
从文件中获取cookie 并访问它。首先创建一个MozillaCookie实例对象,然后调用load方法加载最后生成的文件,然后创建一个带有cookie的opener对象。这里传入build_opener 函数的是一个cookie 处理器对象。和以前一样。
导入cookielib
导入urllib2
#创建MozillaCookieJar实例对象
cookie=cookielib.MozillaCookieJar()
#从文件读取cookie内容到变量
cookie.load("cookie.txt",ignore_discard=True,ignore_expires=True)
#创建request请求
req=urllib2.Request("http://www.baidu.com")
#使用urllib2的build_opener方法创建一个opener
开启器=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
响应=opener.open(req)
print response.read() 简而言之,流程是这样的,创建管理cookie的实例,创建cookie处理器,创建opener,然后创建请求,打开请求。
模拟登录,需要先登录才能获取cookie写入文件,这样就可以访问只有登录后才能访问的页面。主要是使用opener对象。
导入urllib
导入urllib2
导入cookielib
文件名="cookie.txt"
#声明一个MozillaCookieJar对象实例来保存cookie,然后将其写入文件
cookie=cookielib.MozillaCookieJar(文件名)
开启器=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
postdata=urllib.urlencode({
"学习":"201200131012",
"密码":"23342321"
})
#登录教育系统的URL
登录网址="http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bks_login2.login"
#模拟登录并将cookie保存到变量中
结果=opener.open(loginUrl,postdata)
#将cookie保存到cookie.txt
cookie.save(ignore_discard=True,ignore_expires=True)
#使用cookie请求访问另一个URL。该URL为分数查询URL。
GradeUrl="http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bkscjcx.curscopre"
#请求访问分数查询URL
结果=opener.open(gradeUrl)
print result.read()是模拟登录代码,处理验证码,但暂时无法登录成功。原因尚不清楚,不过表格中有一个lt值每次登录都在变化,很可能就是因为这个原因。
#编码=utf-8
导入urllib2
导入cookielib
导入urllib
进口再
导入系统
"""模拟登录"""
重新加载(系统)
sys.setdefaultencoding("utf-8")
# 防止中文报错
CaptchaUrl="http://cas.nwpu.edu.cn/cas/Captcha.jpg"
PostUrl="http://cas.nwpu.edu.cn/cas/login"
# 验证码地址和邮寄地址
文件名="cookies.txt"
cookie=cookielib.MozillaCookieJar(文件名)
处理程序=urllib2.HTTPCookieProcessor(cookie)
开启器=urllib2.build_opener(处理程序)
# 将cookie 绑定到opener,cookie 由cookielib 自动管理
用户名="*****"
密码="*****"
# 用户名和密码
图片=opener.open(CaptchaUrl).read()
# 使用openr访问验证码地址并获取cookie
#文件输入输出,local是文件引用句柄
本地=打开("e:/image.jpg", "wb")
local.write(图片)
local.close()
# 将验证码保存到本地
SecretCode=raw_input("请输入验证码:")
# 打开保存的验证码图片并输入
发布数据={
"encodedService":"http%3a%2f%2fportal.nwpu.edu.cn%2fdcp%2findex.jsp",
"服务":"http://portal.nwpu.edu.cn/dcp/index.jsp",
"服务名称":"空",
"loginErrCnt":"0",
"用户名": 用户名,
‘密码’:密码,
"lt":"LT_nwpuapp1_-527299-2Mb1S8cdQco6UOnf7WNb",
"自动登录":"假",
"验证码":SecretCode
}
# 根据抓包信息构建表单
标题={
"接受": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"接受语言": "zh-CN,zh;q=0.8",
"连接": "保持活动",
"内容类型": "application/x-www-form-urlencoded",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36(KHTML,如Gecko)Chrome/46.0.2490.86 Safari/537.36",
"推荐人":"http://cas.nwpu.edu.cn/cas/login?service=http%3A%2F%2Fportal.nwpu.edu.cn%2Fdcp%2Findex.jsp"
}
# 根据抓包信息构造头部
数据=urllib.urlencode(postData)
# 生成post数据,格式为?key1=value1key2=value2
request=urllib2.Request(PostUrl, 数据, headers)
# 构造request请求
尝试:
响应=opener.open(请求)
cookie.save(ignore_discard=True,ignore_expires=True)
anotherurl="http://portal.nwpu.edu.cn/dcp/forward.action?path=/portal/portalp=HomePage"
响应=opener.open(另一个网址)
结果=响应.read()
打印结果
#登录后打印页面
除了urllib2.HTTPError、e:
打印代码
# 使用之前存储cookie的opener登录页面
6. 正则表达式
来过滤字符串。 Python 中的量词默认是贪婪的,会匹配尽可能多的字符。但是提取一般都采用非贪婪模式吗?是一个不贪婪的角色。
反斜杠问题将使用本机字符串来解决。例如,要匹配,请使用如下正则表达式:r""
这个问题需要在实践中验证,因为Python核心编程中有这样一个模式用于匹配:
patt="w+@(w+.)?w+.com"
这与电子邮件地址匹配。 @ 前面是一个与至少一个字符或数字匹配的字符,后面是分组、匹配主机名,然后是域名。
这里没有提及任何影响,所以实践是检验真理的唯一选择。
Python中的Re模块中,在匹配之前,最好使用compile()函数进行预编译。预编译后返回regex对象,然后可以使用re模块中的方法完成匹配。
如果不进行预编译,则使用re模块中的函数。函数名和功能与上面的方法一致。
compile()的用法如下:pattern=re.compile(r"hello")
除了正则表达式对象之外,还有另一种对象类型,即匹配对象,它是调用match 或search 成功后返回的结果。主要有两种方法:分组和分组
group 方法根据需要返回所有匹配的对象或特定子组。
groups 方法返回一个仅包含或包含所有子组的元组
re模块中的函数和方法
match(pattern,string,flags=0)
使用正则表达式匹配字符串,从字符串的开头开始匹配,失败则返回None。
一个匹配的实例。最后一个匹配的子组被赋予别名。它的作用就是匹配! (任何字符)。
进口再
# 匹配以下内容:单词+空格+单词+任意字符
m=re.match(r"(w+) (w+)(?P.*)", "hello world!")
re.search(pattern,string,flags=0)
search() 是模式在搜索字符串中首次出现的位置,任意位置位置而不是在开始时尝试匹配。
进口再
# 将正则表达式编译成Pattern对象
模式=re.compile(r"world")
# 使用search() 查找匹配的子字符串。如果没有匹配的子字符串,则返回None。
# 本例中无法使用match()来成功匹配
match=re.search(pattern,"你好世界!")
如果匹配:
# 使用Match获取群组信息
打印match.group()
输出
# world
re.findall(pattern,string[,flags])
搜索字符串并以列表形式返回所有匹配的子字符串。
进口再
模式=re.compile(r"d+")
print re.findall(pattern,"one1two2third3four4")
输出
# ["1", "2", "3", "4"]
re.split(pattern,string[,maxsplit])
使用正则表达式的split 方法将成为更强大的工具。 maxsplit指定最大分割数,如果不指定则全部分割。
进口再
模式=re.compile(r"d+")
打印re.split(pattern,"one1two2third3four4")
输出
# ["one", "two", "third", "four", ""]
re.sub(pattern,repl,string,max=0)
使用repl替换字符串中所有正则表达式匹配的地方,max为最大替换次数,如果没有指定,全部将被替换。当repl为字符串时,可以使用id或g、g来指代组,但不能使用数字0。
进口再
模式=re.compile(r"(w+) (w+)")
s="我说,你好世界!"
打印re.sub(模式,r"2 1", s)
输出
#说我,世界你好!此外,subn 方法将返回替换次数。替换的字符串和指示替换次数的数字作为元组的元素返回。
输出
# ("say i, world hello!", 2)
7. 爬虫框架Scrapy的安装与配置
安装Python就不用说了,安装完后最重要的就是把Python安装文件夹和下面的Scripts文件夹添加到环境变量中,这样cmd命令就可以了line可以直接执行Python命令。
安装pywin32安装地址:http://sourceforge.net/projects/pywin32/
安装完成后,进入Python执行环境,输入import win32com。如果没有错误,说明安装成功。
安装pyOPENSSL下载地址:https://launchpad.net/pyopenssl
下载后复制到Python根目录的Scripts文件夹下,然后在cmd命令中进入Scripts文件夹,执行easy_install.exe pyOpenSSL-0.11-py3.2-win32.egg进行安装。
或者在Scripts文件夹中执行easy_install pyOpenSSLcryptography
或者下载可执行安装文件进行安装。在打开的页面上找到所有下载,然后找到pyOpenSSL-0.11.winxp32-py2.7.exe。直接点击链接下载Python 2.7。如果需要其他版本,请前往网站下载。
安装也完成后,在Python环境中执行import OpenSSL来验证是否安装成功。
pyOpenSSL出错解决尝试第一次安装Twisted,easy_install Twisted,仍然无法工作。
安装cffi后,easy_install cffi,提示VC++9.0 for Python命令错误。
然后我下载了VC++9.0 for python,发现电脑已经安装了,但是还是没有解决问题。
然后看到了钱帮子的博文,Windows 7(64位)系统下安装Scrapy的详细教程。他把需要的依赖全部打包进百度网盘,下载的时候没有网络流量,只好等到下午。充电后,尝试再次下载。
根据他的文章,要安装Scrapy框架,必须安装以下依赖项:
lxml,pywin32,Twisted,pyOpenSSL,zope.interface我回来下载了这些文件,但是安装的时候报错找不到Python2.7。但我安装的是Python2.7。我一头雾水,然后按照之前的教程下载了Python2.7的pyOpenSSL,并执行了easy_install.exe pyOpenSSL -0.11-py2.7-win32.egg 然后就好了,pyOpenSSL安装成功了。
安装lxml,一个可以快速灵活处理xml的Python库
pip install lxml 安装或者easy_install lxml
安装Scrapy的最后一步是安装Scrapy框架。
pip install Scrapy 或easy_install Scrapy
验证一下,输入Scrapy验证是否成功。
7.1 安装依赖文件tips:
看完另一个教程后,我直接从官网下载了需要的依赖文件(.egg格式),然后使用easy_install下载并安装。就直接完成了。如果我通过网络自动下载安装,就会出现各种问题。所有相关文件和链接总结如下:
pywin32:http://sourceforge.net/projects/pywin32/files/pywin32/Build%20219/选择对应版本下载安装。这里都是可执行文件,点击直接安装。
pyOpenSSL:https://launchpad.net/pyopenssl/+download 选择要下载的.egg 格式文件。下载后放在Python根目录的Scripts文件夹中。输入CMD执行easy_install文件名即可完成安装。
Twisted:easy_install 扭曲
cffi:easy_install cffi
lxml:easy_install lxml
密码学:https://pypi.python.org/pypi/cryptography
选择对应的Python版本,安装方法与pyOpenSSL相同。
zope.interface:easy_install zope.interface
好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!
【Python网络爬虫教程与实战学习指南】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
python爬虫入门真的太简单了吧!
有12位网友表示赞同!
想学好爬虫,这个笔记应该很有帮助。
有18位网友表示赞同!
最近对网站数据抓取感兴趣,这篇笔记来得真是时候。
有11位网友表示赞同!
Python爬虫我还在学习中,希望能从这里找到一些技巧。
有10位网友表示赞同!
笔记里有没有实战案例?
有12位网友表示赞同!
想了解一下不同网站的爬取方法。
有12位网友表示赞同!
对处理爬取数据的部分比较感兴趣。
有20位网友表示赞同!
Python爬虫的使用场景还挺广泛吧?
有8位网友表示赞同!
学习爬虫能让我更好地理解网页结构吗?
有6位网友表示赞同!
有没有讲解一些爬虫的合法性问题?
有15位网友表示赞同!
分享一下你学python爬虫的心得吧!
有11位网友表示赞同!
这个笔记分享给朋友看看,他准备学习Python爬虫。
有8位网友表示赞同!
爬虫可以用于哪些实际应用场景呢?
有15位网友表示赞同!
笔记里有没有推荐一些Python爬虫相关的工具?
有20位网友表示赞同!
想了解一下如何避开网站的反爬机制。
有18位网友表示赞同!
学习爬虫后,有什么其他的技能可以学习吗?
有17位网友表示赞同!
希望笔记里有关于数据清洗和分析的部分。
有13位网友表示赞同!
爬虫技术发展到什么程度了现在呢?
有15位网友表示赞同!
这个笔记能帮助我实现我的爬虫项目吗?
有20位网友表示赞同!
学习Python爬虫需要哪些基础知识?
有9位网友表示赞同!