更新记录:

  1.新增了headers头的随机获取;

  2.新增了logging模块添加日志信息(学习用);

#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
__author__ = '王益夫'
__mtime__ = '2019/12/20'
'''
'''
版本修改:
V 1.0:用来获取文件的链接和信息,并存储在txt文件中;
V 1.0.1:参照调整headers,新增logging模块输入日志信息;
''' #import 相关的库
import requests
from bs4 import BeautifulSoup
import io
import sys
import re
import os
import time
import random
import logging #方法1:设置文件写入,不设置输出控制台
# LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"
# DATE_FORMAT = "%m/%d/%Y %H:%M:%S %p"
# logging.basicConfig(filename='./temp/CCTV_news.log', level=logging.info, format=LOG_FORMAT, datefmt=DATE_FORMAT) #方法2:handler同时输出到控制台和文件
logger = logging.getLogger()
logger.setLevel('ERROR')
BASIC_FORMAT = "%(asctime)s:%(levelname)s:%(message)s"
DATE_FORMAT = '%Y-%m-%d %H:%M:%S'
formatter = logging.Formatter(BASIC_FORMAT, DATE_FORMAT)
chlr = logging.StreamHandler() # 输出到控制台的handler
chlr.setFormatter(formatter)
chlr.setLevel('ERROR') # 也可以不设置,不设置就默认用logger的level
fhlr = logging.FileHandler('./temp/CCTV_news.log') # 输出到文件的handler
fhlr.setFormatter(formatter)
logger.addHandler(chlr)
logger.addHandler(fhlr) #增加多个浏览器头,避免检测
headers_list = [
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/537.75.14",
"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)",
'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11',
'Opera/9.25 (Windows NT 5.1; U; en)',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',
'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12',
'Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9',
"Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Ubuntu/11.04 Chromium/16.0.912.77 Chrome/16.0.912.77 Safari/535.7",
"Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0",
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'
] global headers
headers = {'User-Agent': random.choice(headers_list)} def getRespose(url):
'''requests获取response文本'''
global headers
try:
r = requests.get(url, headers=headers, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except Exception as e:
#print('链接异常:'+ url)
logging.error('链接异常:%s', url)
raise e def getNowUrls(url,mode=1):
'''解析列表文章的链接和文章名'''
URL_all_set = set()
URL_next_page_set = set()
soup = BeautifulSoup(getRespose(url), 'html.parser')
if mode == 1 :
try:
for line in soup.body.find(class_='xwlist').find_all(name = 'a'):
url_point = line.attrs['href']
logging.warning('采集列表链接:%s', url_point)
if url_point not in URL_all_set:
URL_all_set.add(url_point)
return URL_all_set
except Exception as e:
raise e
logging.error('采集列表链接失败:%s', url)
return False else:
try:
url_next = soup.body.find(class_='page now-page').next_sibling.next_sibling.attrs['href']
if url_next not in URL_next_page_set:
URL_next_page_set.add(url_next)
return URL_next_page_set
else:
#print('链接: ' + str(url_next) + '已存在!')
logging.warning('链接已存在:%s',url_next)
return False
except:
#print('获取下一页地址失败,Url_next')
logging.error('获取下一页链接失败:%s', url)
return False def gettext(url):
try:
demo = getRespose(url)
soup_text = BeautifulSoup(demo, 'html.parser') Text_title = soup_text.head.title.string
Text_text = soup_text.body.find(attrs={'class':'text_content'}).p.string logging.warning('新闻解析成功:%s,文本内容为%s | %s', url, Text_title, Text_text) return Text_title, Text_text
except:
#print('新闻页面解析失败!')
logging.error('新闻页面解析失败: %s',url)
return False def TextWriter(url, file_path=r'.\temp', file_name=r'新闻联播.txt'):
file_all = file_path + '\\' + file_name
if gettext(url):
Get_text_list = gettext(url)
if not os.path.exists(file_path): # os库判断路径是否存在
os.mkdir(file_path) # 不存在创建路径
try:
with open(file_all, r'a+', encoding="utf8") as f:
f.write(Get_text_list[0] + '\n')
f.write(str(Get_text_list[1]) + '\n') # 此处写入失败的原因为该文本为list格式,需要转化为str
f.flush() # 将缓存写入
f.close()
#print('文件写入成功')
logging.warning('文件写入成功:%s', url)
except:
#print('文本写入失败')
logging.error('文件写入失败:%s', url)
return False def main(url):
URL_all = getNowUrls(url,1)
URL_next_page = getNowUrls(url,2)
for url_line in list(URL_all):
time.sleep(random.random())
TextWriter(url_line, file_path=r'.\temp', file_name=r'新闻联播.txt')
URL_all.remove(url_line)
logging.warning('采集列表:%s', URL_all)
logging.warning('下一页:%s', URL_next_page)
if len(URL_all) == 0 and len(URL_next_page) == 1:
Next_url = list(URL_next_page)[0]
URL_next_page.remove(Next_url)
time.sleep(5)
main(Next_url) if __name__ == '__main__':
url = r'http://www.xwlb.top/xwlb.html'
logging.warning("输入的url为:%s", url)
main(url)

  

python学习_新闻联播文字版爬虫(V 1.0.1版)的更多相关文章

  1. python学习_新闻联播文字版爬虫(V 1.0版)

    python3的爬虫练习,爬取的是新闻联播文字版网站 #!/usr/bin/env python # -*- coding: utf-8 -*- ''' __author__ = 'wyf349' _ ...

  2. python学习_数据处理编程实例(二)

    在上一节python学习_数据处理编程实例(二)的基础上数据发生了变化,文件中除了学生的成绩外,新增了学生姓名和出生年月的信息,因此将要成变成:分别根据姓名输出每个学生的无重复的前三个最好成绩和出生年 ...

  3. python学习_循环结构 and 类型判断

    # 循环结构 ### 循环结构(while) - 格式 ```python while 表达式: 语句块 ``` > 执行流程:当程序执行到while语句时,首先判断表达式的真假.若表达式的值为 ...

  4. Python 学习(1) 简单的小爬虫

    最近抽空学了两天的Python,基础知识都看完了,正好想申请个联通日租卡,就花了2小时写了个小爬虫,爬一下联通日租卡的申请页面,看有没有好记一点的手机号~   人工挑眼都挑花了. 用的IDE是PyCh ...

  5. python学习_应用pickle模块封装和拆封数据对象

    学习文件数据处理的时候了解到有pickle模块,查找官方文档学习了一些需要用到的pickle内容. 封装是一个将Python数据对象转化为字节流的过程,拆封是封装的逆操作,将字节文件或字节对象中的字节 ...

  6. python学习笔记(14)--爬虫下载漫画图片修改版

    说明: 1. 2017.3.12,周六从中午吃完包子12点多折腾了一下午加一个晚上,试了4个网站的爬虫,发现都不能下载!甚至前几天测试能下载的都不能用了! 2. 到晚上发现煎蛋网的可以用了,立即试了下 ...

  7. python学习笔记(11)--爬虫下载漫画图片

    说明: 1. 某本子网站爬虫,现在只实现了扒取一页,已经凌晨两点了,又饿又困,先睡觉,明天再写总结吧! 2. 我是明天,我来写总结了! 3. 这个网站的结构是这样的: 主页: 主页-第1页-漫画1封面 ...

  8. Python学习_数据排序方法

    Python对数据排序又两种方法: 1. 原地排序:采用sort()方法,按照指定的顺序排列数据后用排序后的数据替换原来的数据(原来的顺序丢失),如: >>> data1=[4,2, ...

  9. Python学习_从文件读取数据和保存数据

    运用Python中的内置函数open()与文件进行交互 在HeadFirstPython网站中下载所有文件,解压后以chapter 3中的“sketch.txt”为例: 新建IDLE会话,首先导入os ...

随机推荐

  1. 快速分析CPU性能问题

    Linux的CPU性能问题,相信在工作中很容易遇到.这篇文章会总结出一个大概的套路,相信能够解决工作中90%以上的CPU性能问题! 会告诉大家在不同的场景下,cpu性能指标工具如何选择,性能瓶颈怎么找 ...

  2. div随着屏幕滚动而滚动

    <script type="text/javascript"> $(document).ready(function () { var menuYloc = $(&qu ...

  3. 菜鸟系列Fabric——Fabric 基本概念(1)

    Fabric 基本概念 1.区块链介绍 区块链之所以引来关注是因为比特币开源项目,尤其是比特币价值的飙升,让大家开始关注数字货币以及相关技术.那么区块链究竟是什么? 1.1 区块链定义 狭义上,区块链 ...

  4. Visual Basic 中读取逗号分隔的文本文件

    TextFieldParser 对象提供一种可以轻松而高效地分析结构化文本文件(如日志)的方法. TextFieldType 属性用于定义文件是带分隔符的文件还是具有固定宽度文本字段的文件. Dim ...

  5. 2019icpc南昌邀请赛B Polynomial (拉格朗日插值法)

    题目链接:https://nanti.jisuanke.com/t/40254 题意: 思路: 这题要用到拉格朗日插值法,网上查了一下,找到一份讲得特别好的: -------------------- ...

  6. Mybatis数据基本操作

    <insert id="doCreate" parameterType="News"><!--添加数据--> INSERT INTO n ...

  7. CF450A 【Jzzhu and Children】

    普通的模拟题这题用一个队列容器来模拟队列元素是pair类型的,first用来存每个小朋友想要的糖数,second用来存小朋友的序号,然后开始模拟,模拟出口是当队列迟到等于1时就输出当前队列里小朋友的序 ...

  8. cmd_操作MySQL数据库

    建议用 TXT 文档来写代码 然后粘贴至cmd命令直接运行创建students库,表名为student,表包含以下字段: id(主键) name(姓名) age(年龄) sex(性别) sc(综合积分 ...

  9. 从入门到自闭之Python编码

    ascii码: 支持英文,数字,符号 1字节 不支持中文 gbk(国标) 支持英文,数字,符号 1字节 支持中文 2字节 unicode(万国码): 支持英文,数字,符号 4字节 支持欧洲 4字节 支 ...

  10. HTTP协议 django下载安装 url路由分发

    今日内容 HTTP协议 MVC和MTV框架模式 django下载安装 django的url路由分发 HTTP协议 http协议 请求信息格式 GET / HTTP/1.1 请求行 Host: 127. ...