php抓取网页表格信息(Python函数式编程可以让程序的思路更加清晰、易懂定义相应的函数)

优采云 发布时间: 2022-03-29 18:02

  php抓取网页表格信息(Python函数式编程可以让程序的思路更加清晰、易懂定义相应的函数)

  Python函数式编程可以让程序的思维更加清晰易懂

  定义对应的函数,通过调用函数执行爬虫

  from urllib import request

from urllib import parse

# 拼接URL地址

def get_url(word):

url = 'http://www.baidu.com/s?{}'

#此处使用urlencode()进行编码

params = parse.urlencode({'wd':word})

url = url.format(params)

return url

# 发请求,保存本地文件

def request_url(url,filename):

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'}

# 请求对象 + 响应对象 + 提取内容

req = request.Request(url=url,headers=headers)

res = request.urlopen(req)

html = res.read().decode('utf-8')

# 保存文件至本地

  with open(filename,'w',encoding='utf-8') as f:

    f.write(html)

# 主程序入口

if __name__ == '__main__':

word = input('请输入搜索内容:')

url = get_url(word)

filename = word + '.html'

request_url(url,filename)

  爬虫程序以类的形式编写,在类下编写不同的功能函数。代码如下:

  from urllib import request,parse

import time

import random

from ua_info import ua_list #使用自定义的ua池

#定义一个爬虫类

class TiebaSpider(object):

#初始化url属性

def __init__(self):

self.url='http://tieba.baidu.com/f?{}'

# 1.请求函数,得到页面,传统三步

def get_html(self,url):

req=request.Request(url=url,headers={'User-Agent':random.choice(ua_list)})

res=request.urlopen(req)

#windows会存在乱码问题,需要使用 gbk解码,并使用ignore忽略不能处理的字节

#linux不会存在上述问题,可以直接使用decode('utf-8')解码

html=res.read().decode("gbk","ignore")

return html

# 2.解析函数,此处代码暂时省略,还没介绍解析模块

def parse_html(self):

pass

# 3.保存文件函数

def save_html(self,filename,html):

with open(filename,'w') as f:

f.write(html)

# 4.入口函数

def run(self):

name=input('输入贴吧名:')

begin=int(input('输入起始页:'))

stop=int(input('输入终止页:'))

# +1 操作保证能够取到整数

for page in range(begin,stop+1):

pn=(page-1)*50

params={

'kw':name,

'pn':str(pn)

}

#拼接URL地址   

params=parse.urlencode(params)

url=self.url.format(params)

#发请求

html=self.get_html(url)

#定义路径

filename='{}-{}页.html'.format(name,page)

self.save_html(filename,html)

#提示

print('第%d页抓取成功'%page)

#每爬取一个页面随机休眠1-2秒钟的时间

time.sleep(random.randint(1,2))

#以脚本的形式启动爬虫

if __name__=='__main__':

start=time.time()

spider=TiebaSpider() #实例化一个对象spider

spider.run() #调用入口函数

end=time.time()

#查看程序执行时间

print('执行时间:%.2f'%(end-start))  #爬虫执行时间

  以面向对象的方式编写爬虫程序时,思路简单,逻辑清晰,非常容易理解。上述代码主要包括四个功能函数,分别负责不同的功能,总结如下:

  1) 请求函数

  request函数的最终结果是返回一个HTML对象,方便后续函数调用。

  2) 解析函数

  解析函数用于解析 HTML 页面。常见的解析模块有正则解析模块和bs4解析模块。通过分析页面,提取出需要的数据,在后续内容中会详细介绍。

  3) 保存数据功能

  该函数负责将采集到的数据保存到数据库,如MySQL、MongoDB等,或者保存为文件格式,如csv、txt、excel等。

  4) 入口函数

  入口函数作为整个爬虫程序的桥梁,通过调用不同的函数函数实现最终的数据抓取。入口函数的主要任务是组织数据,比如要搜索的贴吧的名字,编码url参数,拼接url地址,定义文件存储路径。

  履带结构

  用面向对象的方式编写爬虫程序时,逻辑结构是比较固定的,总结如下:

  # 程序结构

class xxxSpider(object):

def __init__(self):

# 定义常用变量,比如url或计数变量等

def get_html(self):

# 获取响应内容函数,使用随机User-Agent

def parse_html(self):

# 使用正则表达式来解析页面,提取数据

def write_html(self):

# 将提取的数据按要求保存,csv、MySQL数据库等

def run(self):

# 主函数,用来控制整体逻辑

if __name__ == '__main__':

# 程序开始运行时间

spider = xxxSpider()

spider.run()

  爬虫随机休眠

  在入口函数代码中,收录以下代码:

  #每爬取一个页面随机休眠1-2秒钟的时间

time.sleep(random.randint(1,2))

  爬虫访问 网站 会非常快,这与正常的人类点击行为非常不符。因此,通过随机休眠,爬虫可以模仿人类点击网站,使得网站不容易察觉是爬虫访问网站,但这样做的代价是影响程序的执行效率

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线