python简单爬虫(一)

  学习python前纠结了下,到底是应该一个个知识点吃透,然后写些小程序。还是应该快速掌握基础语法,快速实践。思考后认为前者这么学习速度真心不高,于是花2天时间看了下python3的语法,虽然很多都不明白,但是带着小项目来学习直接解决问题。在项目中遇到问题,查阅一点点解决,这样很靠谱。

  在实现一个最简单的爬虫前,应该知道需要用到哪些东西? 

  1.如果发送一个http请求,来抓取网页内容。

  2.如何方便的解析html的dom节点,如果有像phpquery这样的工具包就太简单了。

  百度了下发现 urlib模块能解决第一个问题,BeautifulSoup模块能解决第二个问题

  urlib3模块简单使用  

 1 import urllib3
 2 
 3 #请求的地址
 4 url = 'https://www.baidu.com/'
 5 
 6 http = urllib3.PoolManager()
 7 r = http.request('GET',url)
 8 
 9 print(r.status)     #请求状态码
10 print(r.data)       #获取内容

  需要注意的是打印出内容(r.data)发现尼玛, 总是有个 b' 这样的东西在字符串最前面。google下发先大致是说,python默认字符是ascii,但是请求的网页编码是utf8字符的,获取的内容需要转成

utf8字符集然后在输出,可以这么干。

print(r.data.decode('utf-8'))

  然后重新运行发现大功告成。

  再来看下BeautifulSoup模块,其实挺简单的就和jquery操作dom类似,具体看文档即可.

  

 1 from bs4 import BeautifulSoup
 2 import re #正则
 3 
 4 str = '''
 5       <div class="menu">
 6     <ul class="main-menu">
 7         <li class="first-menu"><a href="/index.php?m=Admin&c=Goods&a=index&typelist=1">品牌商管理</a></li>
 8         <li class="first-menu"><a href="javascript:;">商品管理</a></li>
 9         <li class="first-menu"><a href="/index.php?m=Admin&c=MyDistribution&a=index">分销平台</a></li>
10         <li class="first-menu">
11             <a href="javascript:;">消息中心</a>
12             <ul class="sub-menu clearfix">
13                 <li><a href="/index.php?m=Admin&c=News&a=businessNewsList">商家公告</a></li>
14                 <li><a href="/index.php?m=Admin&c=Distribution&a=distributionList">申请分销</a></li>
15                 <li><a href="/index.php?m=Admin&c=Message&a=chatMessageList">聊天消息</a></li>
16                 <li><a href="/index.php?m=Admin&c=System&a=systemNewsList">系统公告</a></li>
17             </ul>
18         </li>
19         <li class="first-menu"><a href="javascript:;">嗨库社区</a></li>
20         <li class="first-menu"><a href="javascript:;">我的设置</a></li>
21     </ul>
22 </div>
23 '''
24 
25 soup = BeautifulSoup(str,'html.parser',from_encoding='utf-8')
26 
27 print('获取所有的链接')
28 links= soup.find_all('a'); #list
29 for a in links:
30     print(a),print(a['href']) #获取a标签,和属性href
31 
32 print('获取href为 /index.php?m=Admin&c=Goods&a=index&typelist=1的url')
33 links = soup.find('a',href="/index.php?m=Admin&c=Goods&a=index&typelist=1")
34 print(links.name,links['href'],links.get_text())
35 
36 
37 print('通过class属性')
38 links = soup.find('ul',class_='main-menu')
39 print(links)
40 
41 print('正则匹配')
42 links = soup.find_all('a',href=re.compile(r"List")) # 加r -> 要转义\只需要写成 \\即可 , 不然要写成\\\
43 print(links)

  最后结合2个模块来实现,获取抓取页面的 a标签的href

 1 from bs4 import BeautifulSoup
 2 import re #正则
 3 import urllib.parse
 4 import urllib3
 5 
 6 r_url = 'http://baike.baidu.com/link?url=41wW1kkRvhT23i_c6258EtBeBv6Xwtz7gwd3t0q5k-xCs_ipCGRc_ixcCLMail3QtQe4ZRgOK83ek9aHm44QPa'
 7 
 8 #发送请求获取内容
 9 http = urllib3.PoolManager()
10 r = http.request('GET',r_url)
11 
12 str = data = r.data.decode('utf-8')
13 
14 '''
15 #挽尊学习法,先发获取的内容生成文件,看下到底是什么
16 f = open('2.html','w')
17 f.write(data.decode('utf-8'))
18 f.close()
19 '''
20 
21 soup = BeautifulSoup(str,'html.parser',from_encoding='utf-8')
22 #通过正则获取所有href 为  /view/123/456.htm 这样的链接
23 links = soup.find_all('a',href=re.compile(r'/view/[\d/]+\.htm'))  # 加r -> \只需要一个 \转义 , 不然要写成\\\
24 
25 for url in links:
26     new_url = url['href']
27     '''
28     将 r_url的域名-> http://baike.baidu.com
29     和 新的url ->  /view/123/456.htm 组装起来
30     '''
31     new_full_url = urllib.parse.urljoin(r_url,new_url) #http://baike.baidu.com/view/123/456.htm
32     print(new_full_url)

  参考:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/

     http://urllib3.readthedocs.io/en/latest/ 

      

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Github远程仓库管理

1. Github 在版本控制系统中&#xff0c;大约90%的操作都是在本地仓库中进行的&#xff1a;暂存&#xff0c;提交&#xff0c;查看状态或者历史记录等等。除此之外&#xff0c;如果仅仅只有你一个人在这个项目里工作&#xff0c;你永远没有机会需要设置一个远程仓库。 只有当…

oracle 中的trunc()函数及加一个月,一天,一小时,一分钟,一秒钟方法

返回处理后的数据&#xff0c;不同于round()&#xff08;对数值进行四舍五入处理&#xff09;&#xff0c;该函数不对指定小数前或后的数值部分进行舍入处理。 语法&#xff1a;trunc(number[,decimals]) 其中&#xff0c;number为待做处理的数值&#xff0c;decimals为需要保留…

【Halcon】Halcon与OpenCV介绍、比较

from:https://blog.csdn.net/taily_duan/article/details/514997691.MVTec HALCONMVTec HALCON 是世界上最全能的机器视觉软件.世界各地的用户从HALCON为快速开发图像分析和机器视觉程序的灵活架构获益匪浅.HALCON 提供了超过1100多种具备突出性能控制器的库,如模糊分析,形态,模…

直接拿来用!最火的Android开源项目(完结篇)

直接拿来用&#xff01;最火的Android开源项目&#xff08;完结篇&#xff09; 2014-01-06 19:59 4785人阅读 评论(1) 收藏 举报 分类&#xff1a;android 高手进阶教程&#xff08;100&#xff09; 摘要&#xff1a;截至目前&#xff0c;在GitHub“最受欢迎的开源项目”系…

ABP理论学习之Web API控制器(新增)

返回总目录 本篇目录 介绍AbpApiController基类 本地化审计日志授权工作单元其他介绍 ABP通过Abp.Web.ApiNuget包集成了 ASP.NET Web API控制器。你可以像以往创建Asp.Net Web API控制器那样创建Web API控制器。依赖注入对于有规律的ApiController&#xff08;其实就是继承自Ab…

C++类构造函数初始化列表及初始化成员变量的误区

构造函数初始化列表以一个冒号开始&#xff0c;接着是以逗号分隔的数据成员列表&#xff0c;每个数据成员后面跟一个放在括号中的初始化式。例如&#xff1a;[cpp] view plaincopyclass CExample { public: int a; float b; //构造函数初始化列表 CExampl…

将centos7打造成桌面系统

前言 以下所有操作默认在root权限下执行&#xff0c;桌面环境是kde&#xff0c;使用gnome的也可以参考一下。我收集的以下要用到的一些安装包&#xff0c;360网盘http://yunpan.cn/csMhBAp92vTgN 提取码 92e2以下要用的安装软件语法&#xff1a;通过软件源在线安装&#xff1a;…

VC2010打开资源视图时提示“指南必须指定类型”,.rc资源文件损坏(转)

VC: 打开资源视图时提示“指南必须指定类型 ”(Guideline……specify type) &#xff0c;.rc资源文件损坏 可能是TFS导致的使用记事本打开.rc文件&#xff0c;找到“DESIGNINFO”节&#xff0c;会看到如下的数据&#xff1a; BEGIN , 50 , 13798327 EN…

C++ virtual 析构函数

copy自:http://zxjgoodboy.blog.sohu.com/61482463.html 在此基础上稍作修改C中虚析构函数的作用 我们知道&#xff0c;用C开发的时候&#xff0c;用来做基类的类的析构函数一般都是虚函数。可是&#xff0c;为什么要这样做呢&#xff1f;下面用一个小例子来说明&#xff1a; …

(八)企业部分之nginx+tomcat+memcached负载均衡集群搭建

【server1】vim /usr/local/lnmp/tomcat/conf/context.xml<Context>......<Manager className"de.javakaffee.web.msm.MemcachedBackupSessionManager"memcachedNodes"n1:172.25.45.1:11211,n2:172.25.45.2:11211"failoverNodes"n1"req…

泛型算法(二十三)之排列算法

1、is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2)&#xff1a;C11版本&#xff0c;判断两个序列是否为同一元素集的两个排列。 std::vector<int> c1 {1, 2, 3, };std::vector<int> c2 {1, 2, 3, 1, 3};//判断两个序…

C++ 虚函数经典深入解析

from&#xff1a;https://blog.csdn.net/gggg_ggg/article/details/45915505C中的虚函数的作用主要是实现了多态的机制。 关于多态&#xff0c;简而言之就是用父类型别的指针指向其子类的实例&#xff0c;然后通过父类的指针调用实际子类的成员函数。 这种技术可以让父类的指针…

21OGNL与ValueStack(VS)-静态方法访问

转自&#xff1a;https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 在LoginAction中增加如下方法&#xff1a;public static String getSta() { return "这是LoginAction中的静态方法"; } 然后在loginSuc.jsp中增加如下代码&#xff1a; 调用Action中的静…

win7通过easyBCD引导ubuntu

我电脑配置了固态和传统双硬盘&#xff0c;SSD已经装了win7&#xff0c;然后在传统硬盘上安装ubuntu&#xff0c;结果安装完成后看不到ubuntu的入口。因为跟win7不是装在一个驱动设备上&#xff0c;所以使用easyBCD的Linux&#xff0f;BCD选项也无法正确引导。最后通过easyBCD的…

深入理解C++中的explicit关键字

深入理解C中的explicit关键字kezunhaigmail.com http://blog.csdn.net/kezunhaiC中的explicit关键字只能用于修饰只有一个参数的构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的&#xff0c; 跟它相对应的另一个关键字是implicit, 意思是隐藏的,构造函数默认情况下即声…

JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结(转)

hibernate以及mybatis都有过学习&#xff0c;在java面试中也被提及问道过&#xff0c;在项目实践中也应用过&#xff0c;现在对hibernate和mybatis做一下对比&#xff0c;便于大家更好的理解和学习&#xff0c;使自己在做项目中更加得心应手。 第一方面&#xff1a;开发速度的对…

Caffe源码解析4: Data_layer

转载请注明出处&#xff0c;楼燚(y)航的blog&#xff0c;http://home.cnblogs.com/louyihang-loves-baiyan/ data_layer应该是网络的最底层&#xff0c;主要是将数据送给blob进入到net中&#xff0c;在data_layer中存在多个跟data_layer相关的类 BaseDataLayerBasePrefetchingD…

理解C++中拷贝构造函数

拷贝构造函数的功能是用一个已有的对象来初始化一个被创建的同样对象&#xff0c;是一种特殊的构造函数&#xff0c;具有一般构造函数的所有特性&#xff0c;当创建一个新对象的时候系统会自动调用它&#xff1b;其形参是本类对象的引用&#xff0c;它的特殊功能是将参数代表的…

IDEA mybatis-generator-maven-plugin 插件的使用

2019独角兽企业重金招聘Python工程师标准>>> pom.xml中添加插件 <plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.2</version><configuratio…

python优秀网友学习笔记推荐

AstralWindMr.Seven 转载于:https://www.cnblogs.com/migongci0412/p/5154892.html