博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用python实现简单爬虫
阅读量:5060 次
发布时间:2019-06-12

本文共 2177 字,大约阅读时间需要 7 分钟。

简单的爬虫架构

调度器

URL管理器

管理待抓取的URL集合和已抓取的URL,防止重复抓取,防止死循环

功能列表

1:判断新添加URL是否在容器中2:向管理器添加新URL3:判断容器是否为空4:将已爬取URL移动到已爬取集合5:获取待爬取URL

实现方式

1:使用set(自动去除重复项目)2:使用关系数据库(MySQL)3:使用缓存数据库(redis):大型公司使用这玩意

网页下载器

功能列表

1:get 2:post3:伪装头信息4:HTTPCookieProcessor5:ProxyHandler6:HTTPSHandler7:HTTPRedirectHAndler

实现方法

1:urllib22:URLlib33:requests

此处使用request实现

#coding=utf-8import requests,jsonurl = 'http://www.baidu.com'headers = {'user-agent':'Mozilla/5.0'}  #模拟Mozilla浏览器头,此行可以为空get_data = {'wd':'linux'}r = requests.get(url,headers=headers,params = get_data)if r.status_code == 200:    '访问成功'    try:        file = open('baidu.com','w')        file.write('本次访问网址是:' + r.url)        print('本次访问网址是:' + r.url)    except IOError as e:        print('文件读取错误:' + str(e))    try:        file = open('baidu.com','a+')        text = r.text        file.write('\n得到数据如下:\n' + text)        print('得到数据长度:' + str(len(r.content)))    except IOError as e:        print('文件读取错误:' + str(e))else:    print('我是假的404')

解析器

1:正则表达式         传统经典,语法奇葩难懂2:html.parser       python自带3:BeautifulSoup     可以使用上下两种解析器,集合天地精华4:lxml              可以解析html和xml#coding=utf-8from bs4 import BeautifulSoup,retry:    file = open('baidu.com','r')    html_str = file.read()    print(type(html_str))except IOError as e:    print(str(e))finally:    if 'file' in locals():        file.close()if 'html_str' in locals():    #根据HTML网页字符串创建BeautifulSoup对象    soup = BeautifulSoup(        html_str,               #html文档字符串        'html.parser',          #html解析器,可以使用py自带的html_parser        from_encoding='utf-8'   #文档编码格式        )    #soup.find(name,attrs,string)   #只查找第一个匹配对象,支持正则表达式    nodes = soup.find_all('a')    for node in nodes:        print(node.name)            #得到节点标签(参数1)        print(node['href'])         #得到属性(参数2)        print(node.get_text())      #得到文字(参数3)    #正则匹配    nodes2 = soup.find_all('a',href=re.compile(r"map"))    print('\n\n\n\n\n---------------------------百年分割线------------------------\n')    for node in nodes2:        print(node.name)            #得到节点标签(参数1)        print(node['href'])         #得到属性(参数2)        print(node.get_text())      #得到文字(参数3)

转载于:https://www.cnblogs.com/cenzhongman/p/6914400.html

你可能感兴趣的文章
64位操作系统下IIS报“试图加载格式不正确的程序”错误
查看>>
存储过程里构建模糊查询,引号的处理
查看>>
黑莓游戏引擎
查看>>
Dijkstra算法和其邻接矩阵实现
查看>>
IE6 中 window.location.href 不能跳转
查看>>
v形 加强版
查看>>
EMVTag系列12《卡片内部风险管理数据》
查看>>
Recommendation system
查看>>
linux批量删除进程
查看>>
第二次代码作业
查看>>
[转载] 自定义标签,jsp调用java类
查看>>
2017-12 CDQZ集训(已完结)
查看>>
10.0.4_CentOS_120g_for_Qt5.3.2
查看>>
题画【沙枣树】
查看>>
2017暑假 第三周 学习总结(复习)
查看>>
Oracle --- 也来谈谈分页
查看>>
在mac中导入hadoop2.6.0源代码至eclipse 分类: A1_H...
查看>>
[UIImageView]Frame Rectangles
查看>>
Codeforces 787D. Legacy 线段树优化建图+最短路
查看>>
大杂烩 -- Iterator 并发修改异常ConcurrentModificationException
查看>>