java爬虫抓取动态网页(Python编程修改程序函数式编程的实战二抓取您想要的)

优采云 发布时间: 2021-09-19 22:08

  java爬虫抓取动态网页(Python编程修改程序函数式编程的实战二抓取您想要的)

  实战一

  抓取所需的网页并将其保存到本地计算机

  首先,我们简要分析了要编写的爬虫程序,它可以分为以下三个部分:

  在澄清逻辑之后,我们可以正式编写爬虫程序

  导入所需模块

  from urllib import request, parse

  拼接URL地址

  定义URL变量和拼接URL地址。代码如下:

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

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

params = parse.quote(word)

full_url = url.format(params)

  向URL发送请求

  发送请求主要分为以下步骤:

  代码如下:

  # 重构请求头

headers = {

'User-Agent':

'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'

}

# 创建请求对应

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

# 获取响应对象

res = request.urlopen(req)

# 获取响应内容

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

  另存为本地文件

  将已爬网的照片保存到本地。这里需要使用python编程的文件IO操作。代码如下:

  filename = word + '.html'

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

f.write(html)

  整个程序如下:

  from urllib import request, parse

# 1.拼url地址

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

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

params = parse.quote(word)

full_url = url.format(params)

# 2.发请求保存到本地

# 重构请求头

headers = {

'User-Agent':

'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'

}

# 创建请求对应

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

# 获取响应对象

res = request.urlopen(req)

# 获取响应内容

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

# 3.保存文件至当前目录

filename = word + '.html'

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

f.write(html)

  尝试运行该程序,进入riotian blog Park,确认搜索,然后您将在当前工作目录中找到“riotian blog Park.HTML”文件

  函数式编程修改器

  Python函数式编程可以使程序的思想更清晰、更容易理解。接下来,使用函数式编程的思想更改上述代码

  定义相应的函数并通过调用函数执行爬虫程序。修改后的代码如下:

  from urllib import request, 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)

  除了函数式编程外,还可以使用面向对象的编程方法(actual Combation二),将在后续内容中介绍)

  实战二

  抓取*敏*感*词*()页面,如Python爬虫栏和编程栏。只需抓取贴吧的前五页即可@

  确定页面类型

  通过简单的分析,我们可以知道要抓取的*敏*感*词*页面属于静态网页,分析方法非常简单:打开*敏*感*词*,搜索“Python爬虫”,复制页面中的任何部分信息,如“爬虫为什么需要HTTP代理”然后右键单击以查看源代码,并使用Ctrl+F搜索刚刚复制到源代码页上的数据,如下所示:

  

  从上图可以看出,页面中的所有信息都收录在源页面中,不需要从数据库中加载数据,因此该页面是一个静态页面

  查找URL更改规则

  接下来,找到要爬网的页面的URL规则,搜索“Python爬虫”后,贴吧first页面的URL如下:

  https://tieba.baidu.com/f?ie=utf-8&kw=python爬虫&fr=search

  点击第二页,URL信息如下:

  https://tieba.baidu.com/f?kw=python爬虫&ie=utf-8&pn=50

  点击第三页,URL信息如下:

  https://tieba.baidu.com/f?kw=python爬虫&ie=utf-8&pn=100

  再次点击第一页,URL信息如下:

  https://tieba.baidu.com/f?kw=python爬虫&ie=utf-8&pn=0

  如果您不确定,可以继续浏览更多页面。最后,您发现URL有两个查询参数kW和PN,PN参数是常规的,如下所示:

  第n页:pn=(n-1)*50

#参数params

pn=(page-1)*50

params={

'kw':name,

'pn':str(pn)

}

  URL地址可以缩写为:

  https://tieba.baidu.com/f?kw=python爬虫&pn=450

  写爬虫

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

  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)) #爬虫执行时间

  程序执行后,爬网文件将保存到pychart当前工作目录,输出结果如下:

  输入贴吧名:python爬虫

输入起始页:1

输入终止页:2

第1页抓取成功

第2页抓取成功

执行时间:12.25

  用面向对象的方法编写爬虫程序时,思路简单,逻辑清晰易懂,以上代码主要包括四个功能,分别负责不同的功能,总结如下:

  1)request函数

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

  2)解析函数

  解析功能用于解析HTML页面,常用的解析模块包括常规解析模块和BS4解析模块,通过对页面的分析提取所需的数据,在后续内容中详细描述

  3)保存数据功能

  此功能负责将捕获的数据保存到数据库中,如mysql、mongodb等,或以文件格式保存,如CSV、TXT、Excel等

  4)entry函数

  entry函数的主要任务是组织数据,例如要搜索的贴吧名称、编码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))

  爬虫访问网站的速度非常快,这与正常人的点击行为非常不一致。因此,通过随机睡眠,爬虫可以像成年人一样点击网站,因此网站不容易被检测到是爬虫访问网站,但这样做的代价是影响程序的执行效率

  聚焦爬虫(Focused crawler)是一种执行效率较低的程序,提高其性能一直是业界关注的问题,这也催生了高效的python爬虫框架scripy

  程序员灯塔

  转载请注明原链接:[网络爬虫学习]实战、抓取网页和贴吧数据

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线