网页数据抓取(Python爬虫架构详细分析及调度器的一个应用方法介绍 )

优采云 发布时间: 2022-03-29 11:13

  网页数据抓取(Python爬虫架构详细分析及调度器的一个应用方法介绍

)

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

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

  URL管理器:包括要爬取的URL地址和已经爬取的URL地址,防止URL重复爬取和URL循环爬取。实现 URL 管理器的方式主要有 3 种:内存、数据库和缓存数据库。

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

  网页解析器:通过解析一个网页字符串,可以根据我们的需求提取我们有用的信息,或者按照DOM树的解析方式进行解析。网页解析器有正则表达式(直观地说,就是将网页转换成字符串,通过模糊匹配提取有价值的信息,当文档比较复杂时,这种方法提取数据会很困难),html。parser(Python自带),beautifulsoup(第三方插件,可以使用Python自带的html.parser解析,也可以使用lxml,比别人更强大),lxml(第三方插件) ,可以解析xml和HTML),html.parser和beautifulsoup和lxml都是用DOM树的方式解析的。

  应用程序:它是由从网页中提取的有用数据组成的应用程序。

  1.爬虫入门程序

  首先,我们调用urllib2库中的urlopen方法,传入一个URL。这个网址是百度主页,协议是HTTP协议。当然你也可以把HTTP换成FTP、FILE、HTTPS等,只是代表一种访问。控制协议,

  urlopen一般接受三个参数,其参数如下: urlopen(url, data, timeout) 第一个参数url是URL,

  第二个参数data是访问URL时要传输的数据,

  第三次超时是设置超时时间。

  第二个和第三个参数不能传送。data的默认值为None,timeout的默认值为socket._GLOBAL_DEFAULT_TIMEOUT。必须传输第一个参数 URL。在这个例子中,我们传输百度的 URL。执行 urlopen 方法后,返回一个响应对象,返回的信息存储在其中。

  #导入功能库 urllib2

import urllib2

#调用urllib2库的urlopen方法 第一个参数url即为URL

response = urllib2.urlopen("http://www.baidu.com")

#response 对象有一个 read 方法,可以返回获取到的网页内容。

print response.read()

  2.爬虫添加数据,headers,然后post请求

  我们介绍了urllib库,现在我们模拟登录CSDN。当然,上面的代码可能无法登录,因为CSDN也有序列号字段。原则。一般登录网站一般都是这样写的。我们需要定义一个名为values的字典,参数我设置的用户名和密码,下面使用urllib的urlencode方法对字典进行编码,命名为data。构造请求时,传入url和data两个参数,运行程序,返回的是POST后渲染的页面内容。注意上面的字典还有另一种定义方式,下面的写法是等价的

  部分网站 不会同意直接以上述方式访问程序。如果识别出了问题,那么网站根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers属性。首先打开我们的浏览器,调试浏览器F12,我用的是Chrome,打开网络监控,如下图,比如知乎,登录后我们会发现登录后界面变了,和一个新的本质上,这个页面收录了很多内容。这些内容不是一次加载的。实际上,执行了许多请求。一般是先请求HTML文件,再加载JS、CSS等。经过多次请求,网页的骨架和肌肉都完成了,整个网页的效果就出来了。

  #导入功能库库名 urllib urllib2

import urllib

import urllib2

#填写地址url

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

#设置Headers 的参数

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

#设置data 参数是访问URL时要传送的数据

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

#设置Headers 的属性

headers = { 'User-Agent' : user_agent }

#对data数据进行编码

data = urllib.urlencode(values)

#进行请求

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

#进行访问

response = urllib2.urlopen(request)

#返回获取到的网页内容

page = response.read()

  3.爬虫添加cookie

  cookielib 模块的主要作用是提供可以存储cookie 的对象,供urllib2 模块使用以访问Internet 资源。Cookielib 模块非常强大,我们可以使用该模块的 CookieJar 类的对象来捕获 cookie 并在后续的连接请求中重新发送,例如模拟登录的能力。该模块的主要对象是 CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。它们的关系:CookieJar -- 派生 --> FileCookieJar -- 派生 --> MozillaCookieJar 和 LWPCookieJar

  import urllib

import urllib2

import cookielib

filename = 'cookie.txt'

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

cookie = cookielib.MozillaCookieJar(filename)

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

postdata = urllib.urlencode({

'stuid':'201200131012',

'pwd':'23342321'

})

#登录教务系统的URL

loginUrl = 'http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bks_login2.login'

#模拟登录,并把cookie保存到变量

result = opener.open(loginUrl,postdata)

#保存cookie到cookie.txt中

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

#利用cookie请求访问另一个网址,此网址是成绩查询网址

gradeUrl = 'http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bkscjcx.curscopre'

#请求访问成绩查询网址

result = opener.open(gradeUrl)

print result.read()

  4.正则表达式

  Python中re模块的主要作用是使用正则表达式来匹配和处理字符串。import 重新导入模块后,可以使用模块下的所有方法和属性

  import re

#定义正则化规则=匹配模式,r表示原生字符串

pattern=re.compile(r"hello")

#匹配文本

# result1=re.search(pattern,"hello hello");

# # print(result1)

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

print(result1)

#点代表任意字符

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

result2=re.match(pattern2,'abcdefgg')

print(result2)

#\转义字符

pattern3=re.compile(r'a\.c')

result3=re.match(pattern3,'a.cdefgg')

print(result3)

#[...]字符串中间包含 -包含 ^不包含

pattern4=re.compile(r"a[a-z,A-z]bc")

result4=re.match(pattern4,r'aabcv')

print(result4)

#\d数字 \D不是数字

pattern6=re.compile(r"a\dbc")

result6=re.match(pattern6,'a6bcdd')

print(result6)

#\s空白字符 \S不是空白字符

pattern7=re.compile(r"a\sbc")

result7=re.match(pattern7,'a bcdd')

print(result7)

#\w 单词字符[A-Z,a-z,0-9] \W非单词字符

pattern8=re.compile(r"a\wbc")

result8=re.match(pattern8,'a bcdd')

print(result8)

#匹配邮箱

pattern9=re.compile(r"\d+@\w+\.\w+")

result9=re.search(pattern9,"1231qw@qq.com")

print(result9)

#*表示0个或者无无限次

rexg=re.compile(r'\d*\w*')

res=re.search(rexg,'1dddd')

print(res)

#+前一个字符一次或者无限次

rexg=re.compile(r'\d+\w')

res=re.search(rexg,'1dddd')

print(res)

#?表示一个或者0个

rexg=re.compile(r'\d?ddd')

res=re.search(rexg,'123dddd')

res2=re.match(rexg,'123dddd')

print(res)

print(res2)

#{m}匹配前一个字符m个

rexg=re.compile(r'1\d{10}')

res=re.search(rexg,'16666666666')

print(res)

#{m,n}m至n次

rexg=re.compile(r'\d{5,12}@\w{2}\.\w{3}')

res=re.search(rexg,'1436619325@qq.com')

print(res)

#非贪恋模式

rexg=re.compile(r'\d{5,10}?')

res=re.search(rexg,'1436619325')

print(res)

#^字符串开头支持多行

rexg=re.compile(r'^abc')

res=re.search(rexg,'abc123')

print(res)

#$字符串结尾支持多行

rexg=re.compile(r'abc$')

res=re.search(rexg,'123abc')

print(res)

#\A字符串结尾支持多行

rexg=re.compile(r'\Aabc')

res=re.search(rexg,'abc123')

print(res)

#\z字符串结尾支持多行

rexg=re.compile(r'abc\Z')

res=re.search(rexg,'123abc')

print(res)

#|满足任意提交

rexg=re.compile(r'1\d{10}|d{5,12}@qq\.com')

res=re.search(rexg,'dsafsd13424234324234sssss111111111111@qq.com')

print(res)

#分组

rexg=re.compile(r'(abc){3}')

res=re.search(rexg,'abcabcabcss')

print(res)

#分组+别名

rexg=re.compile(r'(?Pabc)88(?P=tt)')

res=re.search(rexg,'abcabc88abcss')

print(res)

#分组+编号

rexg=re.compile(r'(\d{3})uu\1')

res=re.search(rexg,'123uu123')

print(res)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线