本文主要是介绍nova-week4,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
任务
继续优化上周的两个爬取链接和内链的程序,对爬取内容进行筛选
注:在过程中遇到问题:“ImportError: cannot import name etree”
解决办法:
- 网上提到可能是把文件夹命名为了"lxml"—btw无果
- 问题不在1,把setting-project里的第三方库"lxml"升级为最新版,就OK了???(黑人问号,原理不知,可能是版本冲突)
mission 1:
import requests
import json
from lxml import etree
import re
def get_html(url):#获取网站的html代码并将其用lxml初始化,并返回Html=requests.get(url)html=etree.HTML(Html.text)return html
def get_link(html):#获取html中的链接地址,并写入文件with open(r"C:\Users\lenovo\Desktop\untitled\nova\week4\link.json",'w')as f:link=html.xpath("//a/@href")link_selected=[]for i in link:if re.match("/.+\.htm",i):link_selected.append(i)Json=json.dumps(link_selected,sort_keys=True, indent=4, separators=(',', ': '))f.write(Json)
if __name__=="__main__":html=get_html(r'http://www.nju.edu.cn/')get_link(html)
结果:对爬取内容进行了筛选,共爬取64条链接
mission 2:
import re
import requests
from lxml import etree
import json
def json_read():#读取json文件中的内容with open(r"C:\Users\lenovo\Desktop\untitled\nova\week4\link.json",'r') as f:link=json.loads(f.read())return link
def get_postfix(url):#爬取对应url下的链接地址Html=requests.get(url)html=etree.HTML(Html.text)link=html.xpath("//a/@href")return link
def url_search(link_pull,link):#寻找匹配的内链地址并输出;通过递归穷尽所有分支for i in link:if re.match(r"/.+\.htm",i):#因为爬取后最后一条链接是图片,没想到什么好办法,通过这个判断去掉这一条if ".jpg" in i:breakif str("http://www.nju.edu.cn"+i) in link_pull:continueelse:print("http://www.nju.edu.cn"+i)link_pull.append(str("http://www.nju.edu.cn"+i))post=get_postfix("http://www.nju.edu.cn"+i)if post!=[]:url_search(link_pull,post)return
if __name__=="__main__":link=json_read()link_pull=linkurl_search(link_pull,link)
知识点:爬取下的链接是绝对地址!!!前面只需要加"http://www.nju.edu.cn"
每个链接之间是相互独立的,而不是父子节点之间的关系!!!
结果:共爬取下来423条内链
这篇关于nova-week4的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!