玩玩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另外一个库相关了,很简单的呀!
posted @ 2020-03-11 15:09  Admin_sys  阅读(246)  评论(0编辑  收藏  举报