python3.6 使用newspaper库的Article包来快速抓取网页的文章或者新闻等正文
我主要是用了两个方法来抽去正文内容,第一个方法,诸如xpath,css,正则表达式,beautifulsoup来解析新闻页面的时候,总是会遇到这样那样各种奇奇怪怪的问题,让人很头疼。第二个方法是后面标红的,主要推荐用newspaper库
在导师公司,需要利用重度搜索引擎来最快的获取想要的内容,再建立语料库,于是我用python 的 beautifulsoup 和urllib 来抓取一些网页内容来做训练语料。
搜索关键词是 “人名 公司 说”,其实只要三步就可以完成,第一个是直接在百度主页上搜,然后先是在百度结果搜索页上的链接获取下来,第二个是进入结果搜索页主页面上的的那些链接,然后抓去正文内容,第三个就是将获取到的正文内容保存下来,对内容进行分词,比如在正文里面找到人说过的话,可以用说、表示、说到、曾经说、“ ”来判断,这些不做描述了,主要说一下抽取正文内容。
提取链接
通过网页源码,发现这些超链接都是在<div class = "main"> </div>标签之间(不同网站有不同的格式),用beautifulsoup来提取比较好,若用urllib容提取到其他url,不易区分。 例如下图
代码如下:
#encoding=utf-8
#coding=utf-8
import urllib,urllib2
from bs4 import BeautifulSoup
import re
import os
import string
#得到url的list
def get_url_list(purl):
#连接
req = urllib2.Request(purl,headers={'User-Agent':"Magic Browser"})
page = urllib2.urlopen(req)
soup = BeautifulSoup(page.read())
#读取标签
a_div = soup.find('div',{'class':'main'})
b_div = a_div.find('div',{'class':'left'})
c_div = b_div.find('div',{'class':'newsList'})
links4 = []
#得到url的list
for link_aa in c_div:
for link_bb in link_aa:
links4.append(link_bb.find('a'))
links4 = list(set(links4))
links4.remove(-1)
links4.remove(None)
return links4
#从list中找到想要的新闻链接
#找到要访问的下一个页面的url
def get_url(links):
url = []
url2 = ''
url3 = ''
url4 = ''
i = 0
for link in links:
if link.contents == [u'后一天']:
continue
#上一页 和 下一页 的标签情况比较复杂
#取出“上一页”标签的url(貌似不管用)
if str(link.contents).find(u'/> ') != -1:
continue
#取出“下一页”标签的url
if str(link.contents).find(u' <img') != -1:
url2 = link.get("href")
i = 1
continue
if link.contents == [u'前一天']:
url3 = link.get("href")
continue
url.append(link.get("href"))
if(i == 1):
url4 = url2
else:
url4 = url3
return url , url4
def main():
link_url = []
link_url_all = []
link_url_all_temp = []
next_url = ''
#开始的url
purl = 'http://news.ifeng.com/listpage/4550/20140903/1/rtlist.shtml'
link_url = get_url_list(purl)
link_url_all , next_url = get_url(link_url)
#做了100次循环
for i in range(100):
link_url = get_url_list(next_url)
link_url_all_temp , next_url = get_url(link_url)
link_url_all = link_url_all + link_url_all_temp
#将全部url存档
path = 'd:\\url.txt'
fp = open(path,'w')
for link in link_url_all:
fp.write(str(link)+'\n')
fp.close()
if __name__ == '__main__':
main()
但是!!!!这个方法并不好一点都不好 ,太不方便
我们可以用python 的一个库 newspaper的Article包,直接抽取文章内容,不用再分析web页面上的什么diva,css啊
from newspaper import Article
url = 'http://news.ifeng.com/a/20180504/58107235_0.shtml'
news = Article(url, language='zh')
news .download()
news .parse()
print(news.text)
print(news.title)
# print(news.html)
# print(news.authors)
# print(news.top_image)
# print(news.movies)
# print(news.keywords)
# print(news.summary)
也可以直接导入包
import newspaper
news = newspaper.build(url, language='zh')
article = news.articles[0]
article.download()
article.parse()
print(article.text)
我用到的是几代码为:
第一段代码为获取结果搜索页的url链接,将这些链接保存到一个txt文件
第二段代码是进入就过搜索页的链接,抽去正文内容
这个方法比上一个真是好到爆,这个库包就是好用!!!强烈推荐
def baidu_search(wd,pn_max,save_file_name):
#百度搜索爬虫,给定关键词和页数以及存储到哪个文件中,返回结果去重复后的url集合
url= "https://www.baidu.com/s"
# url = "https://www.google.com.hk"
# return_set = set()
with open(save_file_name, 'a', encoding='utf-8') as out_data:
for page in range(pn_max):
pn = page*10
querystring = {
"wd":wd,
"pn":pn,
"oq":wd,
"ie":"utf-8",
"usm":2,
}
headers = {
'pragma': "no-cache",
'accept-encoding': "gzip, deflate, br",
'accept-language': "zh-CN,zh;q=0.8",
'upgrade-insecure-requests': "1",
'user-agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
'accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
'cache-control': "no-cache",
'connection': "keep-alive",
}
try:
response = requests.request("GET", url, headers = headers, params=querystring)
html=etree.HTML(response.text, parser=etree.HTMLParser(encoding='utf-8'))
# print(response.text)
titles=[]
titles_tags=html.xpath('//div[@id="content_left"]/div/h3/a')
for tag in titles_tags:
title=tag.xpath('string(.)').strip()
titles.append(title)
urls=html.xpath('//div[@id="content_left"]/div/h3/a/@href')
print(len(urls))
for data in zip(titles, urls):
# out_data.write(data[0] + ',' + data[1] + '\n')
out_data.write(data[1] + '\n')
except Exception as e:
print ("页面加载失败", e)
continue
# def exc_search_content():
# url = "https://www.baidu.com/s"
# response = requests.request("GET", url)
# responser = requests.request("GET",response.url)
# html = etree.HTML(responser.content, parser=etree.HTMLParser(encoding='utf-8'))
# urls = html.xpath
if __name__ == '__main__':
wd = "马云 阿里巴巴 曾经说"
pn = 4
save_file_name = "save_url.txt"
return_set = baidu_search(wd,pn,save_file_name)
import urllib
import re
import os
import string
from bs4 import BeautifulSoup
import logging
from newspaper import Article
urlLinks = []
save_urls = 'save_url.txt'
file = open(save_urls,'r')
#读取之前保存的url
for line in file:
urlLinks.append(line)
file.close()
print(len(urlLinks))
print(urlLinks)
for link in urlLinks:
try:
news = Article(link.strip(), language = 'zh')
news.download()
news.parse()
print(news.text)
print('-------------------------------------------------------------------------------------------------------')
except Exception as e:
print("Error: 网页为404错误")
现在说一下安装这个库,在settings配置环境,添加包newspaper的时候总是添加不进去。那就pip吧!
于是打开命令行窗口,输入pip3 install --ignore-installed --upgrade newspaper3k,等待一会就安装好了。
如果文章没有指明使用的什么语言的时候,Newspaper会尝试自动识别。
或者现在python3版本用的都是newspaper3k,所以再pycharm左下角打开命令行直接输 pip install newspaper3k就可以了
---------------------
作者:lijiaqi0612
来源:CSDN
原文:https://blog.csdn.net/lijiaqi0612/article/details/81707128
版权声明:本文为博主原创文章,转载请附上博文链接!
python3.6 使用newspaper库的Article包来快速抓取网页的文章或者新闻等正文的更多相关文章
- 利用pandas库中的read_html方法快速抓取网页中常见的表格型数据
本文转载自:https://www.makcyun.top/web_scraping_withpython2.html 需要学习的地方: (1)read_html的用法 作用:快速获取在html中页面 ...
- Python3简单爬虫抓取网页图片
现在网上有很多python2写的爬虫抓取网页图片的实例,但不适用新手(新手都使用python3环境,不兼容python2), 所以我用Python3的语法写了一个简单抓取网页图片的实例,希望能够帮助到 ...
- fiddler抓包工具 https抓取 ios手机端抓取
fiddler抓包工具 https抓取 ios手机端抓取 转载链接:https://www.cnblogs.com/bais/p/9118297.html 抓取pc端https请求,ios手机端 ...
- jmeter旅程第一站:Jmeter抓包浏览器或者抓取手机app的包
学习jmeter?从实际出发,我也是一个初学者,会优先考虑先用来做一些简单的抓包.接口测试,在实践的过程中学习jmeter用途.那么接下来,这篇文章我会以jmeter抓包开启我的jmeter旅程. 这 ...
- 安卓微信连接fiddler等抓包工具无法抓取https
问题描述: 在手机连接pc的fiddler后,安卓微信打不开https页面,安卓的浏览器.qq等都可以正常访问https,ios也都可以,就只有安卓微信放问https是空白页面 解决思路: 一. 证书 ...
- R语言XML包的数据抓取
htmlParse 函数 htmlParse加抓HTML页面的函数. url1<-"http://www.caixin.com/"url<-htmlParse(url1 ...
- [转]Firefox+Burpsuite抓包配置(可抓取https)
0x00 以前一直用的是火狐的autoproxy代理插件配合burpsuite抓包 但是最近经常碰到开了代理却抓不到包的情况 就换了Chrome的SwitchyOmega插件抓包 但是火狐不能抓包的问 ...
- Firefox+Burpsuite抓包配置(可抓取https)
0x00 以前一直用的是火狐的autoproxy代理插件配合burpsuite抓包 但是最近经常碰到开了代理却抓不到包的情况 就换了Chrome的SwitchyOmega插件抓包 但是火狐不能抓包的问 ...
- 在Mac Os(苹果)上用手机抓包软件Charles抓取微信小程序中的高清无水印视频
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_118 手机抓包是一名测试工程师常备的技能,比如我想查看一个接口请求的参数.返回值,还有移动设备上的http请求.https请求,这 ...
随机推荐
- Nowcoder Sum of Maximum ( 容斥原理 && 拉格朗日插值法 )
题目链接 题意 : 分析 : 分析就直接参考这个链接吧 ==> Click here 大体的思路就是 求和顺序不影响结果.故转化一下思路枚举每个最大值对答案的贡献最后累加就是结果 期间计数的过程 ...
- CF 25 E 三个字符串 KMP模板
Test Time Limit: 2000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Submit Status ...
- TTTTTTTTTTTTT 树的直径 Codeforces Beta Round #14 (Div. 2) D. Two Paths
tiyi:给你n个节点和n-1条边(无环),求在这个图中找到 两条路径,两路径不相交,求能找的两条路径的长度的乘积最大值: #include <iostream> #include < ...
- HGOI 20190705 题解
Problem A 树状数组 给出数x,一直执行x = x and (x+1)-1 直到 x=0 为止 询问这个数执行运算的次数. 这个数以二进制的形式表述出 x = s1 & s2 .... ...
- Luogu P4709 信息传递 (群论、生成函数、多项式指数函数)
题意: 题解: 这道题我思路大方向是正确的,但是生成函数推错导致一直WA,看了标程才改对-- 首先一个长为\(m\)的轮换的\(n\)次幂会分裂成\(\gcd(n,m)\)个长为\(\frac{m}{ ...
- B. Chocolates
B. Chocolates time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- STS(Spring tool suite)集成配置jdk,maven和Tomcat
STS是spring官网的一个集成开发工具,最近在学springboot,所以用了. 在本文中将介绍如下内容: 搭建开发的 JDK(1.8) 环境. 配置 Maven 环境. 配置 Tomcat 环境 ...
- 排序算法总结(java实现)
排序算法 介绍:排序分为内部排序和外部排序,内部排序指在内存中进行的排序过程:外部排序指在外存中进行排序的过程,但是此过程建立在多次访问内存的基础上(分成一段段利用内部排序进行排序). 以下排序均属于 ...
- 布尔 kotlin(4)
布尔布尔用 Boolean 类型表示,它有两个值: true 和 false .若需要可空引用布尔会被装箱.内置的布尔运算有:|| – 短路逻辑或&& – 短路逻辑 ...
- 使用多块GPU进行训练 1.slim.arg_scope(对于同等类型使用相同操作) 2.tf.name_scope(定义名字的范围) 3.tf.get_variable_scope().reuse_variable(参数的复用) 4.tf.py_func(构造函数)
1. slim.arg_scope(函数, 传参) # 对于同类的函数操作,都传入相同的参数 from tensorflow.contrib import slim as slim import te ...