python爬取糗事百科
闲来无事,找点段子一乐呵,就逛到糗事百科,这次爬取没有什么难度,唯一值得说道的是增加了一点点的代码健壮性。
import requests
from lxml import etree
class Spider():
def __get_page(self,url,headers):
try:
response = requests.get(url,headers=headers)
if response.status_code == 200:
return response.text
else:
return None
except Exception:
return None
def __parse_page(self,html):
results = []
data = etree.HTML(html)
items = data.xpath('//div[@id="content-left"]/div')
for item in items:
#获取作者
author = item.xpath('./div[1]/a[2]/h2/text()')
if author:
results.append(author[0].strip())
else:
results.append('匿名用户')
#获取内容
content = item.xpath('./a[1]/div/span/text()')
if content:
results.append(''.join(content).replace('\n',''))
else:
results.append('此用户没有内容')
#获取好笑数
number = item.xpath('./div[2]/span[1]/i/text()')
if number:
results.append(number[0])
else:
results.append('0')
return results
def __save_to_txt(self,data):
with open('data.txt','w',encoding='utf-8') as f:
f.write(data)
def run(self):
for i in range(1,13):
url ='https://www.qiushibaike.com/text/page/' + str(i)
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)'
' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
html = self.get_page(url,headers)
result = self.parse_page(html)
self.save_to_txt(str(result))
#实例化类
spider = Spider()
spider.run()
- 其中类里的方法是私有方法,外部不可调用。
- 解析网页部分增加了判断获取字段为空的处理方法。
- 欢迎大家跟我交流学习。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
(六)Java并发学习笔记--并发容器(J.U.C)
JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能。因为同步容器将所有对容器状态的访问都 串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低。因此Java5.0开 始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入了java.util.concurrent包。与Vector和Hashtable、Collections.synchronizedXxx()同步容器等相比,java.util.concurrent中引入的并发容器主要解决了两个问题: 1)根据具体场景进行设计,尽量避免synchronized,提供并发性。 2)定义了一些并发安全的复合操作,并且保证并发环境下的迭代操作不会出错。 java.util.concurrent中容器在迭代时,可以不封装在synchronized中,可以保证不抛异常,但是未必每次看到的都是"最新的、当前的"数据。 下面是对并发容器的简单介绍: ConcurrentHashMap代替同步的Map(Collections.synchroniz...
-
下一篇
Java并发同步器AQS
AQS是AbstractQueuedSynchronizer的简写,中文名应该叫抽象队列同步器(我给的名字,哈哈),出生于Java 1.5。 一、什么是同步器 多线程并发的执行,之间通过某种 共享 状态来同步,只有当状态满足 xxxx 条件,才能触发线程执行 xxxx 。 这个共同的语义可以称之为同步器。可以认为以上所有的锁机制都可以基于同步器定制来实现的。 而juc(java.util.concurrent)里的思想是 将这些场景抽象出来的语义通过统一的同步框架来支持。 juc 里所有的这些锁机制都是基于 AQS ( AbstractQueuedSynchronizer )框架上构建的。下面简单介绍下 AQS( AbstractQueuedSynchronizer )。 可以参考Doug Lea的论文The java.util.concurrent Synchronizer Framework 我们来看下java.util.concurrent.locks大致结构 上图中,LOCK的实现类其实都是构建在AbstractQueuedSynchronizer上,为何图中没有用UML线表示...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS关闭SELinux安全模块
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL数据库在高并发下的优化方案
- SpringBoot2更换Tomcat为Jetty,小型站点的福音