代码地址:
github
gitee
(1)CSS选择器
需要先创建一个parsel.Selector对象
from parsel import Selector
html 可以是请求某个网页的源码,也可以是html,xml格式的字符串
selector = Selector(html)
创建Selector对象之后就可以开始使用了
tags = selector.css(’.content’)
我们平时使用的css中,对某一个标签进行修饰时,使用的是 .class_attr
在这里也是如此
.content 就是指查询所有 class 为 content 的标签
查询的结果是一个特殊的对象,不能直接得到需要的数据
将css()函数查询到的结果转换为字符串或者列表,需要使用一个函数
• get()
• getall()
(2)属性提取
href_value = selector.css('a::attr(href)').get() #提取href标签的值
title=page.css(".title-article::text").get() #提取文本内容
2.selenium
选择元素的方法
find_element_by_class_name:根据class定位
find_element_by_css_selector:根据css定位
find_element_by_id:根据id定位
find_element_by_link_text:根据链接的文本来定位
find_element_by_name:根据节点名定位
find_element_by_partial_link_text:根据链接的文本来定位,只要包含在整个文本中即可
find_element_by_tag_name:通过tag定位
find_element_by_xpath:使用Xpath进行定位
PS:把element改为elements会定位所有符合条件的元素,返回一个List
比如:find_elements_by_class_name
返回的是web_element对象
3.tomd
text=tomd.Tomd(content).markdown
将获取的文章转换为markdown形式
1.获取一篇文章
#对一篇文章的爬取
def spider_one_csdn(title_url): # 目标文章的链接
html=requests.get(url=title_url,headers=head).text
page=parsel.Selector(html)
#创建解释器
title=page.css(".title-article::text").get()
title=filter_str(title)
print(title)
content=page.css("article").get()
content=re.sub("" ,"",content)
content = re.sub("
", "", content)
#过滤a标签和br标签
text=tomd.Tomd(content).markdown
#转换为markdown 文件
path = os.getcwd() # 获取当前的目录路径
file_name = "./passage"
final_road = path + file_name
try:
os.mkdir(final_road)
print('创建成功!')
except:
# print('目录已经存在或异常')
pass
with open(final_road+r"./"+title+".md",mode="w",encoding="utf-8") as f:
f.write("#"+title)
f.write(text)
time.sleep(1)
2.获取博主所有文章
def get_article_link(user):
#获取某个博主的所有文章
page=1
while True:
link = "https://blog.csdn.net/{}/article/list/{}".format(user, page)
print("现在爬取第", page, "页")
html = requests.get(url=link, headers=head).text
cel = parsel.Selector(html)
name_link = cel.css(".article-list h4 a::attr(href) ").getall()
if not name_link:
break
#没有文章就退出
for name in name_link:
spider_one_csdn(name)
page+=1
time.sleep(1)
3.获取博主名字
def nb_bozhu():
#获取前十博主的csdn名称
driver=webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://blog.csdn.net/rank/writing_rank")
names=driver.find_elements_by_xpath("//div[@class='rank-item-box d-flex align-items-center']//div[@class='name d-flex align-items-center']/h2/a")
name_list=[]
for name in names:
final_name=name.get_attribute("outerHTML")
final_name=re.sub(',"",final_name)
final_name=re.sub('">.*','',final_name)
name_list.append(final_name)
print(final_name)
driver.quit()
time.sleep(1)
return name_list