首页 > 编程语言 >Python怎样写个通用爬虫模板?

Python怎样写个通用爬虫模板?

时间:2022-12-02 14:01:36浏览次数:39  
标签:__ Python 爬虫 url html link print 模板

其实经常写爬虫的程序员应该都知道,做一个爬虫工作无非就是三个步骤:下载数据、解析数据、保存数据。基本所有爬虫万变不离其宗,都是这样的套路。

下面就是Python写出来一个完整的爬虫需要的几个步骤代码示例,可以供大家参考。

首先是下载数据

def dowmlpad(url, user_agent='wswp', proxy=None, num_retries=2, timeout=5):
"""
# 支持500错误重试
# 设定用户爬虫ip user_agent
# 支持爬虫ip
"""
print('DownloadURL:',url)

#配置用户爬虫ip
headers = {'User-agent':user_agent}
request = urllib.request.Request(url, headers=headers)
#配置
opener = urllib.request.build_opener()

#判断是否爬虫ip
if proxy:
proxy_params = {urllib.parse.urlparse(url).scheme:proxy}
opener.add_handler(urllib.request.ProxyHandler(proxy_params))
try:
html = opener.open(request, timeout=timeout).read()
except urllib.request.URLError as e:
print('Download error:',e.reason)
html = None
if num_retries > 0:
if hasattr(e,'code') and 500 <= e.code <600:
html = dowmlpad(url, user_agent, num_retries-1)
except Exception as e:
print('error :',e)
html = None

return html

其次是解析数据

#编写爬取规则,获得数据
def scrape_callback(url,html):
csslist = ['span[property = "v:itemreviewed"]', 'span.year', 'strong[property="v:average"]']
try:
tree = lxml.html.fromstring(html)
row = [tree.cssselect('{0}'.format(field))[0].text for field in csslist]

print(url, row)
except Exception as e:
print("ScrapeCallback error:",e)

"""
seed_url:种子url
link_regex: 提取链接的正则表达式
max_depath:提取链接的深度,默认为2爬虫到达第二场页面后不再提取链接 ,对于种子页面取出的链接页面,就是第二层,
scrape_callback:回掉函数
"""
def link_crawler(seed_url, link_regex, max_depath=2, scrape_callback=None):
crawl_queue = [seed_url] #配置爬取队列,其实就是一个存储url的列表
#seen = set(crawl_queue)
seens = {seed_url:1}

# 循环直到队列为空退出
while crawl_queue:
url = crawl_queue.pop() # 移除队列最后一个元素,并返回值
html = dowmlpad(url) # 根据url 下载页面
depth = seens[url] # 获得url深度
print(depth)

#获取页面中的链接
for link in get_links(html):
if depth != max_depath and re.search(link_regex,link):
link = urllib.parse.urljoin(seed_url, link) #组装规范链接

#添加链接到爬取队列中
if link not in seens:
seens[link] = depth+1
crawl_queue.append(link)

#如果处理回调函数存在,则进行回调处理
if scrape_callback:
scrape_callback(url, html)

再次是保存数据

import csv
class ScrapeCallback:
def __init__(self):
self.writer = csv.writer(open('countries.csv','w'))
self.fields = ('name','year','score')
self.writer.writerow(self.fields)

def __call__(self, url,html):
csslist = ['span[property = "v:itemreviewed"]', 'span.year','strong[property="v:average"]']
try:
tree = lxml.html.fromstring(html)
row = [tree.cssselect('{0}'.format(field))[0].text for field in csslist]
self.writer.writerow(row)
print(url, row)
except Exception as e:\
print("ScrapeCallback error:",e)

最后主函数

if __name__ == '__main__':
#测试
send_url = "https://movie.douban.com/"
link_regex = '(/subject/[\d]+/)' #获取链接的规则
#使用类的方式来写,下面两个一样结果
link_crawler(send_url,link_regex,max_depath=2, scrape_callback=ScrapeCallback())
#link_crawler(send_url, link_regex, max_depath=2, scrape_callback=scrape_callback)

标签:__,Python,爬虫,url,html,link,print,模板
From: https://blog.51cto.com/u_13488918/5906981

相关文章

  • python图片转文字
    转载先将图片每个像素的hsv(色相,饱和度,明度)值转化为可读取对象再将图像按v用取平均值的方法进行压缩,最后根据压缩后图像的每个像素点的v值转换成字符进行输出scale......
  • 企业如何有效的防爬虫?
    防爬虫,简单来说,就是在尽量减少对正常用户的干扰的情况下尽可能的加大爬虫的成本。而反防爬虫,或者说制造隐蔽性强的爬虫,就是尽量模拟正常用户的行为。这两者是动态博弈的。......
  • VSCode中Debug远程Python程序,断点失效
    解决方法:找到调试要使用的python解释器路径Linux命令:whereispython我这里是/home/tao/anaconda/envs/spyketorchproject/bin/python3.10在VSCode中修改Debug配置文件......
  • python实操案例__02—利用prettytable库模拟高铁售票系统
    1问题描述设计一个简易售票系统,可循环购票并显示余票。2功能拆解2.1什么是prettytable?PrettyTable是python中的一个第三方库,可用来生成美观的ASCII格式的表格,本实操......
  • 第十三周python实验报告
    一个pygame篮球自动弹跳代码如下:importsysimportpygamepygame.init()size=width,height=640,480screen=pygame.display.set_mode(size)color=(0,0,0)ball=p......
  • Python实验报告——第13章 Pygame游戏编程
    Python实验报告——第13章Pygame游戏编程 实验报告【实验目的】 1.掌握Pygame的基础知识。【实验条件】1.PC机或者远程编程环境。 【实验内容】1.完成第......
  • Python 图片主题检测并剪切
    importcv2importnumpyasnp#主题检测,剪切defimageCut(srcImage,desImage):try:#1、加载图片,转成灰度图#image=cv2.imread("D:/work/......
  • PYTHON - openpyxl (一)
    1.1安装pipinstallopenpyxl1.2工作簿函数说明wb=load_workbook(filename)打开工作簿wb=Workbook()创建空白工作簿wb.save(filename)保存工......
  • 搭建WSL ubuntu python 环境的过程
    前提-windows11home版本目的-想启用ubuntu版本开发pythonapp Step打开WSL2,并且安装ubuntuwindows10企业版,win11家庭版,企业版都支持WSL2具体......
  • Python_使用Python将一个文件夹下的多个文件夹中的图片复制到一个文件夹中
     代码:#coding=utf-8importosimportshutil#目标文件夹(最终要复制到的文件夹),此处为相对路径,也可以改为绝对路径determination='/../../目标文件夹/'ifnotos......