赞
踩
工具:
import urllib.request
urllib.request库可以模拟浏览器发送网页请求并获取request的结果。
以科技类新闻为例,拟爬取这样一篇文章。
首先,发送请求
html = "https://baijiahao.baidu.com/s?id=1654779534169792316&wfr=spider&for=pc"
request = urllib.request.Request(html)
写入获取到的网页,并转化成python可读的字符
response = urllib.request.urlopen(request) # 获取网页
html_page = response.read().decode("utf-8") # 按utf-8格式读取,存入html_page
输出看看:
结果显示,python已经爬取了网页全部信息, 接下来就是数据清洗部分了。
弄清楚过程后,将上面代码合并成精简形式:
response = urllib.request.urlopen("https://baijiahao.baidu.com/s?id=1654779534169792316&wfr=spider&for=pc") # 获取网页
html_page = response.read().decode("utf-8") # 按utf-8格式读取,存入html_page
上面抓取的网页显示混乱,利用BeautifulSoup库,先将上述网页转化成标准形式输出。
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_page)
print(soup.prettify())
观察发现,我们想提取的文本都在和之间,只要提取这部分就可以。
尝试用正则匹配:
result_pattern=r'<span class="bjh-p">(.*)</span>'
result_match=re.findall(result_pattern,html_page)
print(result_match)
发现还是有很多标签和超链接没有去掉。
我们想要获取的是正文body部分,观察beautifulsoup的prettify()标准输出:
发现正文部分有其专属id:“article”,正文中包含了文章和图片,用beautiful提取正文:
div = soup.find(id="article")
print(div.text)
全部正文内容提取完毕。
虽然正文首行包含了标题内容,但并不是真正意义的标题,只是正文文本重复了标题内容。为了格式的完整,继续提取标题:
title = soup.title.string
print(title)
至此,标题+正文提取完毕。
创建txt文件,命名为文章标题
filename = title+'.txt'
写入标题和正文:
with open(filename,'w',encoding='utf-8') as f:
f.write(title)
f.write(div.text)
f.close()
可以看到python已经生成了我们抓取的文章。
查看写入的文件:
with open(filename,'r',encoding='utf-8') as f:
line = f.readlines()
print(line)
用写好的爬虫工具爬取文艺类,体育类文本:
爬虫工具实践成功。
不同网站的源码类型不同,百度咨询的源码较为混乱不好读,可以用BeautifulSoup.prettify()转化成标准格式,获取网页全部内容后再进行清洗。beautifulsoup工具提供的文本清洗功能比正则匹配更简单好用,只要找到要提取部分对应的唯一id即可。百度咨询的正文id为“article",不同网站的id可能不同。
本文清洗后的文章格式如下:
标题和正文各占一行,如果需要提取分段的正文,需要继续添加readlines()工具。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。