玩玩Python数据采集_001
今天上了数据采集的车,先来看看用到哪些库和哪些方法?
库:urllib,BeautifulSoup
方法:.findAll(),.find(),.open(),.URLError(),.HTTPError(),.urlopen()
重点来解析这个.findAll(),.find()方法
.findAll(self, name=None, attrs={}, recursive=True, text=None,
limit=None, **kwargs)方法作用就是在指定网站中查询的标签及相关标签属性值
:name为标签名,str
:attrs为标签属性,dict
:recursive为布尔变量,递归函数,默认是查询标签参数的所有子标签以及子标签的子标签,为False时,只查询文档的一级标签
:text为标签文本,作用是用标签的文本内容去匹配
:limit为find_all方法特有,limit=x,就是获取前x项结果
:keyword可以指定具体属性的标签,例如.findAll(text='xxx'),.findAll(id='a'),指定查询文本为'xxx'或id为a的标签
.find(self, name=None, attrs={}, recursive=True, text=None,**kwargs)方法入参除了没有limit,find方法其实等同于findAll方法的limit为1的情形,其它无异
#举几个栗子,我们用以上方法爬取文章对应的标签或者属性值
#:name=标签名 from urllib.request import urlopen from urllib.error import HTTPError, URLErrorfrom bs4 import BeautifulSoup html=urlopen("https://www.cnblogs.com/") #打开对应网址bsObj=BeautifulSoup(html) # 解析网址html all_a_tag=bsObj.findAll("a") # 查询当前页面所有a标签 print(all_a_tag) #:attrs为标签属性, dictclass_attrs_titlelnk=bsObj.findAll("",{"class":"titlelnk"}) # 查询当前页面所有class属性为titlelnk的标签 print(class_attrs_titlelnk) # 也可以匹配多个值class_attrs_values=bsObj.findAll("",{"class":"diggnum","id":"digg_count_12460575"})# 查询当前页面class属性为diggnum,id属性为digg_count_12460575的标签 print(class_attrs_values) #:recursive 为布尔变量,递归函数,默认是查询标签参数的所有子标签以及子标签的子标签,为False时,只查询文档的一级标签,很少用到recursive_flase=bsObj.find_all("html",recursive=False) # 查询html文档下的一级标签 print(recursive_flase) #:text为标签文本内容 tag_text=bsObj.find_all(text="一起了解 .Net Foundation 项目 No.16") #:查询当前页面标签文本内容为"一起了解 .Net Foundation 项目 No.16",注意,这里返回也是和上面一致,都是ResultSet对象 print(tag_text) #:limit为find_all方法特有,limit=x,就是获取前x项结果,limit要结合其它入参使用,结果筛选 limit_two=bsObj.find_all("",{"class":"titlelnk"},limit=2) #:查询当前页面class标签属性为titlelnk的前2项结果 print(limit_two) #:keyword可以指定具体属性的标签 # 注意使用keyword时,建议少用class属性去查询,因为class在python中属于关键字,要用的时候可以加下划线或者dict类型双引号,.find_all(class_="xxxx)/.find_all({"class":"xxxx"})即可key_word=bsObj.find_all(target="_blank") # 查询当前页面target属性为"_blank"的标签 print(key_word)
练习完例子,就撸撸实战呗:
需求:爬取新浪新闻网站的新闻资讯并取出对应Title及newUrl,最后新闻换行存进text文本中。
from urllib.request import urlopen
from urllib.error import HTTPError, URLError
from bs4 import BeautifulSoup
import time
def get_html():
try:
html = urlopen("http://news.sina.com.cn/hotnews/")
except (HTTPError, URLError) as e: # 如果遇到 http exceptions 或者 url exceptions return -> None
return None
try:
bsObj = BeautifulSoup(html) # t=bsObj.find_all(text="一起了解 .Net Foundation 项目 No.16")
news_list=bsObj.find_all(target="_blank") # 指定查询具体对应的新闻咨询标签属性值
for new in news_list:
new_title=new.get_text() # 获取新闻资讯的Title
new_url=new["href"] # 获取新闻资讯的Url
if new_url != "": # 去除空连接的新闻资讯
res = (time.strftime("%Y-%m-%d") + "标题为: {},如需阅读请点击该链接: {}").format(new_title,new_url) #加个时间,点缀一下
f=open('news_log','a',encoding="UTF-8")
f.write(res) # 写入新闻资讯
f.write("\n")
f.close() # 关闭文件
else:
pass
except AttributeError as e: # 如果在当前页面找不到对应标签或者属性值 return -> None
return None
get_html()
运行效果如下:
铛铛铛,是不是很简单啦、当然这才是入门的。
总结及思考:
"""
BeautifulSoup库四种对象:
a.BeautifulSoup对象
b.Tag对象
c.NavigableString对象
d.Comment对象 # 用来查找HTML文档的注释标签,<!-- 像这样 -->
"""
"""
处理子标签:
bsObj.find().children
处理后代标签:
bsObj.find().descendants()
处理兄弟标签:
bsObj.find().next_siblings()
处理父标签:
bsObj.find().parents()/.parent()
以上几点,例子都还未提及,但我已经撸过了哟、你也来吧!
"""
思考:
a.针对爬出来的内容,我们也可以结合正则去过滤筛选,也就是re
b.还有既然我们爬出信息来了、那我们干嘛不弄成每天定时发送新闻到我们微信来呢?这也就跟itchat,python另外一个库相关了,很简单的呀!
Bug? 不存在的!