玩玩Python数据采集_001

python

今天上了数据采集的车,先来看看用到哪些库和哪些方法?

        库: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

回到顶部