网络爬虫-唐战伟

1.爬虫入门程序

(1).什么是爬虫

爬虫:一段自动抓取互联网信息的程序,从互联网上抓取对于我们有价值的信息。

(2).Python爬虫架构

Python 爬虫架构主要由五个部分组成,分别是调度器、URL管理器、网页下载器、网页解析器、应用程序(爬取的有价值数据)。

调度器:相当于一台电脑的CPU,主要负责调度URL管理器、下载器、解析器之间的协调工作。

URL管理器:包括待爬取的URL地址和已爬取的URL地址,防止重复抓取URL和循环抓取URL,实现URL管理器主要用三种方式,通过内存、数据库、缓存数据库来实现。

网页下载器:通过传入一个URL地址来下载网页,将网页转换成一个字符串,网页下载器有urllib2(Python官方基础模块)包括需要登录、代理、和cookie,requests(第三方包)

网页解析器:将一个网页字符串进行解析,可以按照我们的要求来提取出我们有用的信息,也可以根据DOM树的解析方式来解析。网页解析器有正则表达式(直观,将网页转成字符串通过模糊匹配的方式来提取有价值的信息,当文档比较复杂的时候,该方法提取数据的时候就会非常的困难)、html.parser(Python自带的)、beautifulsoup(第三方插件,可以使用Python自带的html.parser进行解析,也可以使用lxml进行解析,相对于其他几种来说要强大一些)、lxml(第三方插件,可以解析 xml 和 HTML),html.parser 和 beautifulsoup 以及 lxml 都是以 DOM 树的方式进行解析的。

应用程序:就是从网页中提取的有用数据组成的一个应用。

(3)、urllib2 实现下载网页的三种方式

import cookielib

import urllib2  

url = "http://www.baidu.com"

response1 = urllib2.urlopen(url)

print "第一种方法" #获取状态码,200表示成功

print response1.getcode()

#获取网页内容的长度

print len(response1.read())

print "第二种方法"

request = urllib2.Request(url)

#模拟Mozilla浏览器进行爬虫

request.add_header("user-agent","Mozilla/5.0")

response2 = urllib2.urlopen(request)

print response2.getcode()

print len(response2.read())

print "第三种方法"

cookie = cookielib.CookieJar()

#加入urllib2处理cookie的能力

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) urllib2.install_opener(opener)

response3 = urllib2.urlopen(url)

print response3.getcode()

print len(response3.read())

print cookie
2.爬虫程序添加data、header,然后post请求

(1).GET方式  至于 GET 方式我们可以直接把参数写到网址上面,直接构建一个带参数的 URL 出来即可。

import urllib

import urllib2

values={}

values['username'] = "1016903103@qq.com"

values['password']="XXXX"

data = urllib.urlencode(values)

url = "http://passport.youkuaiyun.com/account/login"

geturl = url + "?"+data

request = urllib2.Request(geturl)

response = urllib2.urlopen(request)

print response.read()

(2).header

有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些 Headers 的属性。

import urllib

  import urllib2

  url = 'http://www.server.com/login'

user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'  

values = {'username' : 'cqc',  'password' : 'XXXX' }  

headers = { 'User-Agent' : user_agent }  

data = urllib.urlencode(values)  

request = urllib2.Request(url, data, headers)

response = urllib2.urlopen(request)  

page = response.read()

(3).post方式

我们引入了 urllib 库,现在我们模拟登陆 优快云,当然上述代码可能登陆不进去,因为 优快云 还有个流水号的字段,没有设置全,比较复杂在这里就不写上去了,在此只是说明登录的原理。一般的登录网站一般是这种写法。 我们需要定义一个字典,名字为 values,参数我设置了 username 和 password,下面利用 urllib 的 urlencode 方法将字典编码,命名为 data,构建 request 时传入两个参数,url 和 data,运行程序,返回的便是 POST 后呈现的页面内容。 注意上面字典的定义方式还有一种,下面的写法是等价的

import urllib

import urllib2

values = {"username":"1016903103@qq.com","password":"XXXX"}

data = urllib.urlencode(values)

url = "https://passport.youkuaiyun.com/account/login?from=http://my.youkuaiyun.com/my/mycsdn"

request = urllib2.Request(url,data)

response = urllib2.urlopen(request)

print response.read()

3.爬虫程序添加cookie

Cookie,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密) 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的

(1).首先,我们先利用 CookieJar 对象实现获取 cookie 的功能,存储到变量中

import urllib2

import cookielib

#声明一个CookieJar对象实例来保存cookie

cookie = cookielib.CookieJar()

#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器 handler=urllib2.HTTPCookieProcessor(cookie)

#通过handler来构建opener

opener = urllib2.build_opener(handler)

#此处的open方法同urllib2的urlopen方法,也可以传入request

response = opener.open('http://www.baidu.com')

for item in cookie:    

        print 'Name = '+item.name  

          print 'Value = '+item.value

我们使用以上方法将 cookie 保存到变量中,然后打印出了 cookie 中的值,运行结果如下:

        Name = BAIDUID

        Value = B07B663B645729F11F659C02AAE65B4C:FG=1

        Name = BAIDUPSID

        Value = B07B663B645729F11F659C02AAE65B4C

        Name = H_PS_PSSID

        Value = 12527_11076_1438_10633

        Name = BDSVRTM

        Value = 0

        Name = BD_HOME

        Value = 0

在上面的方法中,我们将 cookie 保存到了 cookie 这个变量中

(2)如果我们想将 cookie 保存到文件中该怎么做呢?这时,我们就要用到 FileCookieJar 这个对象了,在这里我们使用它的子类 MozillaCookieJar 来实现 Cookie 的保存

import cookielib

import urllib2

#设置保存cookie的文件,同级目录下的cookie.txt f

ilename = 'cookie.txt'

#声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件

cookie = cookielib.MozillaCookieJar(filename)

#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器

handler = urllib2.HTTPCookieProcessor(cookie)

#通过handler来构建opener

opener = urllib2.build_opener(handler)

#创建一个请求,原理同urllib2的urlopen

response = opener.open("http://www.baidu.com")

#保存cookie到文件

cookie.save(ignore_discard=True, ignore_expires=True)

(3).从文件中获取 Cookie 并访问 那么我们已经做到把 Cookie 保存到文件中了,如果以后想使用,可以利用下面的方法来读取 cookie 并访问网站

import cookielib

import 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

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))

response = opener.open(req) print response.read()

4.正则表达式

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

(1).re 表达式
import re

# 将正则表达式编译成Pattern对象,注意hello前面的r的意思是“原生字符串”

pattern = re.compile(r'hello')

# 使用re.match匹配文本,获得匹配结果,无法匹配时将返回None

result1 = re.match(pattern,'hello')

result2 = re.match(pattern,'helloo YC!')

result3 = re.match(pattern,'helo YC!')

result4 = re.match(pattern,'hello YC!')

if result1:    

        print(result1)

else:  

          print('匹配失败')

(2)正则表达式

import re

# 将正则表达式编译成Pattern对象,注意hello前面的r的意思是“原生字符串”

pattern = re.compile(r'a.c')

# 使用re.match匹配文本,获得匹配结果,无法匹配时将返回None

result1 = re.match(pattern,'abc')

if result1:    

        print(result1.group())

else:    

         print('匹配失败')

(3)特殊情况

import re

# 将正则表达式编译成Pattern对象,注意hello前面的r的意思是“原生字符串”

pattern = re.compile(r'ad?')

# 使用re.match匹配文本,获得匹配结果,无法匹配时将返回None

result1 = re.match(pattern,'abbbbbbb').span()

if result1:    

         print(result1)

(4)re高级函数

#导入re模块

import re

# 将正则表达式编译成Pattern对象

pattern = re.compile(r'world')

# 使用search()查找匹配的子串,不存在能匹配的子串时将返回None

# 这个例子中使用match()无法成功匹配

match = re.search(pattern,'hello world!')

if match:  

          # 使用Match获得分组信息    

        print(match.group())

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值