玩玩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()
运行效果如下:
以上是 玩玩Python数据采集_001 的全部内容, 来源链接: utcz.com/z/387065.html